DTO Data Transfer Object(데이터 전송 객체)로서 계층간의 데이터 교환을 위해 사용되는 객체다. DTO는 로직을 가지지 않는 순수한 데이터 객체로 Getter/Setter 메서드만을 가진다. Setter 대신 생성자만 이용하면 불변 객체로 사용할 수 있다. public class UserSaveRequestDto { private String userEmail; private String userPassword; // Setter 대신 생성자를 사용하면 불변 객체로 사용할 수 있다. public UserSaveRequestDto(String userEmail, String userPassword) { this.userEmail = userEmail; this.userPassword = ..
이상현상(anormaly) 테이블 내의 데이터들이 불필요하게 중복되어 테이블을 조작할 때 발생되는 비합리적 현상이다. 이상현상 삽입 이상 (Insersion Anomaly) : 데이터를 삽입 시 불필요한 세부 정보를 입력해야 하는 현상 (null 값을 넣는 등) 삭제 이상 (Deletion Anomaly) : 데이터 삭제 시 원치 않는 다른 정보가 같이 삭제되는 현상 갱신 이상 (Update Anomaly) : 데이터를 갱신 시 특정 부분만 수정되어 중복된 값이 모순을 일으키는 현상 함수 종속성(FD, Functional Dependency) 어떤 속성 A의 값을 알면 다른 속성 B의 값이 유일하게 정해지는 관계를 함수 종속성이라고 한다. A->B로 표기하며 A를 B의 결정자(Determinant)라고 ..
상속의 단점을 피하면서 코드를 재사용하기 위해 합성을 사용할 수 있다. 합성은 구현에 의존하지 않고, 퍼블릭 인터페이스에 의존한다. 상속은 부모 클래스에 구현된 코드를 재사용하지만, 합성은 포함된 객체의 퍼블릭 인터페이스를 재사용한다. 이는 구현에 대한 의존성을 인터페이스에 대한 의존성으로 변경시키고, 클래스 사이의 결합도를 낮추는 효과를 준다. 상속을 합성으로 변경하기 10장에서 코드 재사용을 위해 상속을 남용했을 때 생길 수 있는 문제로 3가지 예시를 알아봤었다. 불필요한 인터페이스 상속 문제 메서드 오버라이딩의 오작용 문제 부모 클래스와 자식 클래스의 동시 수정 문제 상속 관계를 합성으로 바꿔서 이 세 가지 문제를 해결할 수 있다. 불필요한 인터페이스 상속 문제 java.util.Properties..
이번 장에서는 클래스를 재사용하기 위해 새로운 클래스를 추가하는 가장 대표적인 기법인 상속과 합성 중 상속과 잘못된 상속으로 인해 발생하는 문제들과 해결방안에 대해 알아보겠습니다. 상속과 중복 코드 DRY원칙 중복 코드는 변경을 방해한다. 중복 코드가 가지는 가장 큰 문제는 코드를 수정하는 데 필요한 노력을 몇 배로 증가시킨다는 것이다. 중복 코드는 수정과 테스트에 드는 비용을 증가시킨다. 만약 요구사항이 변경됐을 때 두 코드를 함께 수정해야 한다면 이 코드는 중복이다. 함께 수정할 필요가 없다면 중복이 아니다. 모양이 유사하다는 것은 단지 중복의 징후일 뿐이다. **DRY는 “반복하지 마라”**라는 뜻의 Don’t Repeat Yourself의 첫 글자를 모아 만든 용어로 간단히 말해 동일한 지식을 중..
RDB (Relation DataBase) 관계형 모델을 기반으로 하는 데이터 베이스를 의미한다. 이를 유지, 관리하기 위한 시스템을 RDBMS(Relation DataBase Management System)이라 한다. RDBMS의 목표 데이터 무결성을 높이는 것이다. 데이터 무결성은 아래 세 종류가 있다. 데이터 무결성에 대한 자세한 내용은 여기를 참고하기 바란다. 엔터티 무결성 참조 무결성 도메인 무결성 특징 상호 관련성을 가진 테이블 집합 테이블 사이의 관계를 외래 키로 표현 2차원 데이터(행과 열)로 표현 SQL을 사용해 질의 ACID 성질 스키마 변경이 어려움 수직적 확장이 쉽고 수평적 확장이 어려움 스키마 변경의 어려움 RDB는 테이블 사이에 서로 의존성이 있고 서로 맞물려있기에 데이터 타입..
로그를 남길 때는 System.out.prinln() 같은 메서드 대신에 로깅 라이브러리를 통해 로그를 출력한다. 이 글에서는 System.out를 쓰면 안 되는 이유와 로깅 라이브러리에 대해서 간략하게 정리했다. 혹시 잘못된 내용을 발견했다면 관련한 지적은 환영한당. System.out을 쓰면 안 되는 이유 성능 저하 PrintStream 클래스의 println 메소드는 synchronized 키워드를 사용한다. print 등 출력 기능을 하는 다른 메서드들도 내부를 살펴보면 synchronized 키워드를 사용하는 것을 확인할 수 있다. synchronized 키워드는 특정 객체에 lock을 걸어 해당 작업을 진행 중인 쓰레드 외에 다른 쓰레드는 해당 작업을 간섭하지 못하도록 막는다. 이를 동기화(s..
HTTP 상태 코드 HTTP 상태 코드는 클라이언트가 보낸 요청의 처리 상태를 응답에서 알려주는 기능으로 크게 다섯 가지 종류로 나뉜다. 1xx : 요청이 수신되어 처리 중 2xx : 요청 정상 처리 3xx : 요청을 완료하려면 추가 행동이 필요 4xx : 클라이언트 오류, 잘못된 문법 등으로 서버가 요청을 수행할 수 없음 5xx : 서버 오류, 서버가 정상 요청 처리하지 못함 세부적인 상태 코드를 모르더라도 앞 글자만 보고 대략적인 메시지 의미를 파악할 수 있다. 2xx 성공 200 OK 요청이 정상 처리된 경우를 의미한다. 201 Created 요청이 성공하여 새로운 리소스가 생성된 경우다. 일반적으로 리소스를 새롭게 생성하는 POST나 PUT 요청을 하면 이 응답 코드를 받을 수 있다. 202 Ac..
개방-폐쇄 원칙 소프트웨어 개체(클래스, 모듈, 함수 등등)는 확장에 대해 여려 있어야 하고, 수정에 대해서는 닫혀 있어야 한다. 확장에 대해 열려 있다 : 애플리케이션의 요구사항이 변경될 때 이 변경에 맞게 새로운 ‘동작’을 추가해서 애플리케이션의 기능을 확장할 수 있다. 수정에 대해 닫혀 있다 : 기존의 ‘코드’를 수정하지 않고도 애플리케이션의 동작을 추가하거나 변경할 수 있다. 컴파일 타임의 의존성을 고정시키고 런타임 의존성을 변경하라 의존성 관점에서 개방-폐쇄 원칙을 따르는 설계란 컴파일 타임 의존성은 유지하면서 런타임 의존성의 가능성을 확장하고 수정할 수 있는 구조라고 할 수 있다. 런타임 의존성 : 실행 시에 협력에 참여하는 객체들 사이의 관계 컴파일 타임 의존성 : 코드에서 드러나는 클래스들..