IoC(제어의 역전, Inversion of Control) 기존 프로그램들은 구현 객체가 스스로 객체를 생성하고 연결하며 실행했다. 구현 객체가 프로그램의 제어 흐름을 조종했다. public class AppConfig { public MemberRepository memberRepository() { return new MemoryMemberRepository(); } public DiscountPolicy discountPolicy() { return new FixDiscountPolicy(); } public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } public OrderService or..
멀티모듈 프로젝트 테스트 멀티모듈 프로젝트로 프로젝트를 진행하면서 느꼈던 불편함 중 하나는, Domain 모듈에 ApplicationContext가 존재하지 않아서 @SpringBootApplication이 존재하는 Application 모듈에서만 테스트를 진행해야하는 것이었다. 테스트 코드를 짜면서 프로젝트를 진행해야하지만, 개발 일정에 밀려서 등한시 하기도 했고 무엇보다 모듈 내에서 테스트 코드를 짜는 방법을 알지 못해서 테스트 코드를 짜지 못했다. 하지만 이번에 리펙토링 작업을 하면서 정상적으로 동작하는지 테스트 해야할 필요가 있었고, 방법을 찾아내게 되었다. 멀티모듈 JPA 테스트 가장 큰 리펙토링 중 하나는 메인 Entity에 상속 관계가 설정되는 부분이었다. 자주 사용했던 부분이라 빌드 오류가..
SOLID SRP(Single Responsibility Principle): 단일 책임 원칙 OCP(Open/Closed Principle): 개방/폐쇄 원칙 LSP(Liskov Substitution Principle): 리스코프 치환 원칙 ISP(Interface Segregation Principle): 인터페이스 분리 원칙 DIP(Dependency Inversion Principle): 의존관계 역전 원칙 1. SRP(Single Responsibility Principle) 하나의 클래스는 하나의 책임만 가져야 한다. 책임의 범위를 정할 때, 가장 중요한 지표가 되는 것은 변경이다. 변경이 있을 때 파급 효과가 적으면 단일 책임 원칙을 잘 따른 것이다. 2. OCP(Open/Closed Pr..
Spring의 핵심 Java의 가장 큰 특징은 객체 지향 언어이다. Spring은 자바 언어 기반의 프레임 워크이다. Spring은 객체 지향 언어가 가진 강력한 특징을 살려내는 프레임 워크이다. 즉, Spring은 좋은 객체 지향 애플리케이션을 개발할 수 있게 도와주는 프레임워크다.\ Polymorphism(다형성) 역할과 구현을 분리하는 것이 중요하다. 역할과 구현으로 구분하면 세상이 단순해지고, 유연해지며 변경도 편리해진다. 클라이언트는 대상의 역할(인터페이스)만 알면 된다. 클라이언트는 구현대상의 내부 구조를 몰라도되며, 내부 구조가 변경되어도 영향을 받지 않으며 나아가 구현 대상 자체를 변경해도 영향을 받지 않는다. Java의 다형성을 이용하여 역할과 구현을 분리 역할 = 인터페이스 구현 = 인..
GitHub Actions + Spring Boot + AWS EC2 + Redis 사용시 발생했던 오류들 Docker에 대해서 깊이 있게 공부하지 않은 상태에서, 당장 개발 서버에 적용해야 하다보니 많은 시간을 잡아먹게 되었다. 내가 진행하고 있는 프로젝트에서는 본인 확인을 위해 메일/메세지로 보내는 인증번호를 저장하기 위해 Redis를 사용하게 되었고, 자동 배포를 진행하기 위해서 Docker와 GitHub Actions을 사용했다. 문제는 아무리 레포를 찾아봐도 Redis와 .jar로 구성되어있는 Applciation을 관리해주는 docker-compose.yaml을 활용하는 법을 이해할 수 없었고(일단 프로젝트에서 제대로 적용이 되지 않았다.) 몇 시간을 허비하다가 해결이 되어 방법을 공유해보도록..
⭐ 컴파일타임(Compiletime)과 런타임(Runtime)의 차이 컴파일타임(Compiletime)과 런타임(Runtime)은 소프트웨어 프로그램개발의 서로 다른 두 계층의 차이를 설명하기 위한 용어이다. 프로그램을 생성하기 위해 개발자는 첫째로 소스코드를 작성하고 컴파일이라는 과정을 통해 기계어코드로 변환 되어 실행 가능한 프로그램이 되며, 이러한 편집 과정을 컴파일타임(Compiletime) 이라고 부른다. 컴파일과정을 마친 프로그램은 사용자에 의해 실행되어 지며, 이러한 응용프로그램이 동작되어지는 때를 런타임(Runtime)이라고 부른다. ⭐ 컴파일 타임 에러(Compile Time Error) 소스코드가 컴파일 되는 과정 중에 발생하는 Syntax Error. 파일 참조 오류 등과 같은 문제들..
1. @AllArgsConstructor / @NoArgsConstructor / @RequireArgsConstructor (생성자 자동완성 어노테이션) @AllArgsConstructor 모든 변수를 사용하는 생성자를 자동완성 시켜주는 어노테이션 @AllArgsConstructor public class Order { private String food; private int price; private String makers; /*@AllArgsConstructor를 사용하면 아래와 같은 생성자를 자동 생성할 수 있다. public Order(String food, int price, String makers) { this.food = food; this.price = price; this.make..
1. UserDto -> User로 변환하는 과정 진행 중, User에 모든 값이 null로 할당되는 오류 발생 build > generated 에 생성된 UserMapperImpl 로직 내에서 toEntity 메서드가 @Override public User toEntity(UserDto arg0) { if ( arg0 == null ) { return null; } User user = new User(); return user; } 와 같이 설정되어 있었다. 실마리 찾기 1. MapperImpl에서 Entity to Dto는 잘 생성되지만 Dto to Entity가 생성되지 않는다. 2. Dto의 Annotation @Getter @AllArgsConstructor을 선언하였을 때는 Entity to..