'React.js, 스프링 부트, AWS로 배우는 웹 개발 101'을 읽고 정리한 글입니다. 1.1 Todo 웹 애플리케이션 1.1.1 Todo 웹 애플리케이션 기능 Todo 생성: + 버튼을 클릭해 Todo 아이템 생성 Todo 리스트: 생성된 아이템 목록을 화면에서 확인 Todo 수정: Todo 아이템을 체크하거나 내용 수정 Todo 삭제: Todo 아이템 삭제 회원가입: 사용자는 회원 가입하고 계정을 통해 Todo 애플리케이션에 접근 가능 로그인: 계정으로 로그인 로그아웃: 로그인한 사용자는 로그아웃 가능 1.1.2 Todo 웹 애플리케이션 아키텍처 프론트엔드와 백엔드 서버가 분리된 이 아키텍처에서 브라우저는 백엔드의 REST API를 이용해서 HTTP 요청을 보낸다. 로컬 환경에서 실행하거나 EC..
'React.js, 스프링 부트, AWS로 배우는 웹 개발 101'을 읽고 정리한 글입니다. 서비스 개발 및 운영에 대해 전반적인 경험을 할 수 있다. 다수의 사용자를 지원하는 웹 기반의 Todo 애플리케이션을 구현하고 배포한다. 그 과정에서 프론트엔드와 백엔드 서버가 분리된 아키텍처를 직접 경험하고 구현한다. 프론트엔드 - React.js 백엔드 - 스프링 부트 Todo 애플리케이션의 기본적인 기능을 구현한 후, 인증 기능을 추가해 다수의 사용자를 지원할 예정이다. 백엔드에서는 JWT를 이용해 스케일의 한계를 극복하는 방법 프론트엔드에서는 로그인 상태를 유지하는 방법에 대해 알아보고 구현 만든 애플리케이션을 AWS에 배포 로드 밸런서, 오토스케일링그룹 등 스케일링에 필요한 서비스를 사용하고 도메인을 구..
JDK1.2부터 컬렉션 프레임워크가 등장하면서 다양한 종류의 컬렉션 클래스가 추가되고 모든 컬렉션 클래스를 표준화된 방식으로 다룰 수 있도록 체계화되었다. 컬렉션 프레임워크(Collections Framework)는 컬렉션, 다수의 데이터를 다루는 데 필요한 다양하고 풍부한 클래스들을 제공하기 때문에 프로그래머의 짐을 상당히 덜어 주고 있으며, 또한 인터페이스와 다형성을 이용한 객체지향적 설계를 통해 표준화되어 있기 때문에 사용법을 익히기에도 편리하고 재사용성이 높은 코드를 작성할 수 있다는 장점이 있다. 컬렉션 프레임워크의 핵심 인터페이스 컬렉션 프레임워크에서는 컬렉션 데이터 그룹을 크게 3가지 타입이 존재한다고 인식하고 그 컬렉션을 다루는데 필요한 기능을 가진 3개의 인터페이스를 정의하였다. 인터페이..
Object클래스 equals(Object obj) public boolean equals(Object obj) { return (this==obj); } Object클래스에 정의되어 있는 equals메서드의 실제 내용이다. 위의 코드에서 알 수 있듯이 두 객체의 같고 다름을 참조 변수의 값으로 판단한다. public class Test { public static void main(String[] args) { Value v1 = new Value(10); Value v2 = new Value(10); if (v1.equals(v2)) System.out.println("v1 == v2"); else System.out.println("v1 != v2"); v2 = v1; if(v1.equals(v2)..
프로그램 오류 프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우가 있다. 이러한 결과를 초래하는 원인을 프로그램 에러 또는 오류라고 한다. 에러의 발생 시점에 따라 컴파일 에러와 런타임 에러로 나눌 수 있는데, 컴파일 에러(compile-time error)는 컴파일할 때 발생하는 에러이고 프로그램의 실행 도중에 발생하는 에러를 런타임 에러(runtime error)라고 한다. 소스코드를 컴파일하면 컴파일러가 소스코드(*.java)에 대해 오타나 잘못된 구문, 자료형 체크 등의 기본적인 검사를 수행하여 오류가 있는지 알려 준다. 하지만 컴파일을 에러 없이 성공적으로 마쳤다고 해서 프로그램의 실행 시에도 에러가 발생하지 않는 것은 아니다. 컴파일러가 소스코드의 기본적인 사항..
인터페이스란? 인터페이스란 일종의 추상 클래스이다. 인터페이스는 추상 클래스처럼 추상 메서드를 갖지만 추상 클래스보다 추상화 정도가 높아서 추상 클래스와 달리 몸통을 갖춘 일반 메서드 또는 멤버 변수를 가질 수 없다. 오직 추상 메서드와 상수만을 멤버로 가질 수 있다. 추상 클래스를 부분적으로만 완성된 '미완성 설계도'라고 한다면, 인터페이스는 구현된 것은 아무것도 없고 밑그림만 그려져 있는 '기본 설계도'라 할 수 있다. 인터페이스도 추상 클래스처럼 불완전한 것이기 때문에 그 자체만으로 사용되기보다 다른 클래스를 작성하는데 도움 줄 목적으로 작성된다. 인터페이스의 작성 'class' 대신 키워드 'interface'를 이용하여 작성할 수 있다. interface에도 클래스와 같이 접근제어자로 publi..
추상클래스란? 클래스를 설계도에 비유한다면, 추상클래스는 미완성 설계도에 비유할 수 있다. 클래스가 미완성이라는 것은 멤버의 개수에 관계된 것이 아니라, 단지 미완성 메서드(추상 메서드)를 포함하고 있다는 의미이다. 미완성 설계도로 완성된 제품을 만들 수 없듯이 추상 클래스로 인스턴스는 생성할 수 없다. 추상 클래스는 상속을 통해서 자손클래스에 의해서만 완성될 수 있다. 추상클래스 자체로는 클래스로서의 역할을 다 못하지만, 새로운 클래스를 작성하는 데 있어서 바탕이 되는 조상 클래스로서 중요한 의미를 갖는다. 새로운 클래스를 작성할 때 아무것도 없는 상태에 시작하는 것보다는 완전하지는 못하더라도 어느 정도 틀을 갖춘 상태에서 시작하는 것이 나을 것이다. 문법 추상 클래스는 키워드 'abstract'를 붙..
다형성이란? 객체지향 개념에서 다형성이란 '여러 가지 형태를 가질 수 있는 능력'을 의미하며, 자바에서는 한 타입의 참조 변수로 여러 타입의 객체를 참조할 수 있도록 함으로써 다형성을 프로그램적으로 구현하였다. 요약하면 조상 클래스 타입의 참조 변수로 자손 클래스의 인스턴스를 참조할 수 있다. class Tv { boolean power; int channel; void power() { power = !power; } void channelUp() { ++channel; } void channelDown() { --channel; } } class CaptionTv extends Tv { String text; void caption() { } } 클래스 Tv와 CatptionTv는 서로 상속관계에 있..
제어자란? 제어자(modifier)는 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여한다. 제어자의 종류는 크게 접근 제어자와 그 외의 제어자로 나눌 수 있다. 접근 제어자 public, protected, default, private 그 외 static, final, abstract, native, transient, synchronized, volatile, strictfp 제어자는 클래스나 멤버 변수와 메서드에 주로 사용되며, 하나의 대상에 대해서 여러 제어자를 조합하여 사용하는 것이 가능하다. 단, 접근 제어자는 하나의 대상에 대해서 하나만 선택해서 사용할 수 있다. static - 클래스의, 공통적인 static은 '클래스의' 또는 '공통적인'의 의미를 가지고 있다. ..
오버라이딩이란? 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것을 오버라이딩이라고 한다. 상속받은 메서드를 그대로 사용하기도 하지만, 자손 클래스 자신에 맞게 변경해야 하는 경우가 많다. 이럴 때 조상의 메서드를 오버라이딩한다. 오버라이딩의 조건 자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 - 이름이 같아야 한다. - 매개변수가 같아야 한다. - 반환 타입이 같아야 한다. 요약하면 선언부가 서로 일치해야 한다. 다만 접근 제어자와 예외는 제한된 조건 하에서만 다르게 변경할 수 있다. 접근 제어자는 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다. 만약 조상 클래스에 정의된 메서드의 접근 제어자가 protected라면, 이를 오버라이딩하는 자손 클래스의 메서드는 접근 제어자가..
상속의 정의와 장점 상속이란, 기존의 클래스를 재사용하여 새로운 클래스를 작성하는 것이다. 상속을 통해서 클래스를 작성하면 보다 적은 양의 코드로 새로운 클래스를 작성할 수 있고 코드를 공통적으로 관리할 수 있기 때문에 코드의 추가 및 변경이 매우 유리하다. 이러한 특징은 코드의 재사용성을 높이고 코드의 중복을 제거하여 프로그램의 생산성과 유지보수에 크게 기여한다. 상속 구현 새로 작성하고자 하는 클래스의 이름 뒤에 상속받고자 하는 클래스의 이름을 키워드 'extends'와 써주면 된다. class Child extends Parent { // ... } 이 두 클래스는 서로 상속 관계에 있다고 하며, 상속해주는 클래스를 '조상(or 부모, 상위, 기반) 클래스'라 하고 상속받는 클래스를 '자손(or 자..
같은 클래스의 멤버들 간에 서로 호출할 수 있는 것처럼 아래 조건을 만족하면 생성자 간에도 서로 호출이 가능하다. - 생성자의 이름으로 클래스 이름 대신 this를 사용한다. - 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다. 아래 코드는 위의 두 조건을 만족시키지 못했기 때문에 에러가 발생한다. class Car { String color; int door; String gearType; Car(String color) { door = 5; Car(color, "auto", 4); } } 에러가 발생한 이유. 생성자 내에서 다른 생성자를 호출할 때 this를 사용하지 않음. 두 번째 줄에서 생성자 호출. this(color, "auto", 4)로 해야 한다. 생성자에서 다..