계층형 아키텍처 구조 - web, domain, persistence 로 나누기최적화된 구조가 아닌 이유애플리케이션의 기능 조각이나 특성을 구분 짓는 패키지 경계가 없다.web 패키지에 UserController 추가, domain 패키지에 UserService, UserRepository, User 추가, persistence 패키지에 UserRepositoryImpl을 추가하게 되어 세부 기능과 역할별로 구분하기 어렵다.애플리케이션이 어떤 유스케이스들을 제공하는지 파악할 수 없다.AccountService, AccountController 처럼 작성하게 되면 어떤 유스케이스를 구현했는지 파악하기 어렵다.특정 기능을 찾기 위해서 어떤 서비스가 이를 구현했는지를 추측해야 하고, 해당 서비스 내의 어떤 메..
Java의 record 클래스는 모든 필드에 대한 값을 자동으로 관리합니다. 또한, 불변 객체를 생성하기 위한 구조를 제공해 줍니다. record 클래스에서는 기본 생성자나 매개변수가 있는 생성자를 구현할 수 없습니다.왜냐하면 불변성을 보장하기 설계된 클래스이기 때문이다.record는 불변 객체를 보장하기 위해 설계되었습니다. 모든 필드는 final로 정의되며, 생성자 외의 다른 초기화 방법을 제공하지 않도록 기본 생성자를 허용하지 않습니다.기본 생성자는 매개변수 없이 객체를 생성합니다. 하지만 record의 특성상 모든 필드를 반드시 초기화해야 하므로 기본 생성자를 사용한 객체 생성은 논리적으로 불가능합니다.기본적으로 모든 필드는 생성자 파라미터로 설정됩니다. Compact constructorComp..
SRP - 단일 책임 원칙단일 책임 원칙은 거의 대다수가 “하나의 컴포넌트는 오로지 한 가지 일만 해야 한다”라고 알고 있다.하지만, SOLID에 S 단일 책임 원칙의 실제 정의는 “컴포넌트를 변경하는 이유는 오직 하나뿐이어야 한다”이다. SOLID를 공부하면서 나도 단일 책임 원칙은 하나의 일만 수행해야 한다라고만 알고 있었는데, 해당 책을 읽으면서 컴포넌트를 변경해야 하는 이유가 하나여야 한다는 정의가 좀 더 알맞는다고 생각이 들었다. 변경해야 하는 이유가 하나인 것은 즉, 하나의 일만 수행한다는 것을 의미한다.! 컴포넌트 A는 다른 모든 컴포넌트에 의존하고 있어서 다른 컴포넌트에 변경이 생길 때 같이 변경되어야 한다.컴포넌트 A는 하나의 역할만 수행하는 게 아니라, 여러 역할을 수행하고 있다.여러 ..
Converter란DB에서 어떤 값을 저장할 때 전/후 처리가 필요한 경우가 있습니다.이를 Spring AttributeConverter 인터페이스를 구현하여 처리할 수 있습니다. 사용 예시로, 자바 코드에서는 성과 이름을 따로 관리하고, 데이터베이스에서는 성이름을 그대로 저장하려는 경우 어떻게 처리하는지 보겠습니다. AttributeConverterpublic interface AttributeConverter { public Y convertToDatabaseColumn (X attribute); public X convertToEntityAttribute (Y dbData);}convertToDatabaseColumn : 데이터베이스 컬럼으로 변환해주는 메서드이며, 자바 객체를 어떻게 변..