본문 바로가기
728x90

Spring Boot 개념 정리27

빈 생명주기 콜백 핵심 내용 이해하기 스프링 컨테이너의 존재 이유는? 객체들을 관리하는 행위를 컨테이너에서 진행한다는 것. 객체를 생성, 소멸까지의 관리를 개발자가 아닌 컨테이너가 대신 해주기 때문에 개발자는 로직 관리에만 집중할 수 있다. 스프링 Bean LifeCycle db연결, 네트워크 소켓 연결 등 시작 시점에 미리 연결한 뒤 어플리케이션 종료시점에 연결을 종료해야 하는 경우 객체의 초기화 및 종료 작업이 필요하다. 그런데 어떤 타이밍에 초기화를 하고 종료할지에 대한 정보가 콜백이다. 스프링 컨테이너 생성 → 스프링 Bean 생성 → 의존관계 주입 → 초기화 콜백 메서드 호출 → 초기화(사용) → 소멸전 콜백 메서드 호출 → 스프링 종료 Bean 라이프 사이클을 압축시키기 위해 생성자 주입을 통해 객체 생성과 의존관계 주입을 한번에.. 2023. 2. 19.
자동 bean 등록, 수동 bean 등록 어떤 경우에 하는게 좋을까? @Component, @Controller, @Service, @Repository 등을 통해 자동으로 스캔하면 굉장히 간단하다. 수동으로 bean 등록을 진행하면 @Configuration 설정 정보 class에서 @Bean을 적고 객체 생성과 주입 대상을 일일이 적어주어야 하기 때문에 번거롭다. 추후에 관리할 빈이 많아서 설정 정보가 커지면 정보를 관리하는 것 자체가 부담이 된다. (유지 보수에 부담) 자동빈을 사용하면 OCP, DIP 같은 객체 지향 원칙을 지킬 수 없나? 그것도 아니다. 잘 지킬 수 있다. 그럼 수동빈을 굳이 사용하는 이유는 무엇인가? 애플리케이션은 크게 업무로직과 기술 지원 로직으로 나눌 수 있다. 업무 로직은 컨트롤러, 서비스, 레포지토리 등을 의미한다. 기술 지원 로직은 말그.. 2023. 2. 19.
너무 복잡한 @Service 코드 리팩토링 해보기 프로젝트를 진행하다보니 하나의 메서드 Service 코드가 너무 길어져 가독성이 떨어지는 문제가 발생. 어떻게 해결할지 고민해보니 기존 복잡한 해당 Service 메서드를 2개의 메서드로 나누어 Controller에서 2가지의 Service 메서드를 호출할 수 있도록 설계하면 되겠다는 생각이 들었다. Controller Controller 부분인데 원래는 하나의 Service 메서드를 호출하는 방식으로 response를 return하였으나 현재는 2개의 메서드를 호출하여 데이터를 처리하는 모습. Service 서비스 단에서 원래 하나의 메서드였던 코드를 2개로 나누어 상단 메서드의 return 값이 하단 메서드의 매개 변수로 사용 되게 끔 설계하였다. ServiceImpl(1번 메서드) 해당 메서드의 r.. 2023. 2. 18.
abstract와 interface의 공통점, 차이점 이해하기 공통점 메서드의 선언만 있고 구현 내용이 없다. 상속받은 클래스는 선언한 추상메서드를 구현하는 매커니즘 차이점 추상 클래스는 extends를 통해 상속 인터페이스는 implements를 통해 상속한다.(다중 상속이 가능함) 추상 클래스는 일반 변수, 생성자, 일반 메서드, 추상 메서드 모두 가질 수 있다. 인터페이스는 상수, 추상 메서드만 가질 수 있다. (생성자, 일반 변수 가질 수 없다.) 2023. 2. 17.
@ComponentScan 개념 이해하기 @Component는 구현체에 달아 놓는 것이다. 인터페이스(추상체)에 달아 놓는 것이 아니다.) 이말은 즉, 스프링 컨테이너에는 추상체가 등록되는 것이 아니라 구현체가 등록되는 것. 해당 예시 코드에서 구현체가 아닌 추상체를 Dependency Injection 하는 모습인데, 우측 스프링 컨테이너를 보면 추상체가 아니라 구현체가 해당 추상체를 가르키는 것으로 보인다. 무슨 의미일까? DIP(Dependency Injection Principal)을 위해 코드 상에는 추상체에 의존하게 설계해야한다. 하지만 AppConfig, AutoAppConfig 등의 파일을 따로 관리하지 않는 @ComponentScan 방식을 따를 경우 DIP를 위반하고 코드 상에서 구현체를 의존하게 하는 방법밖에 떠오를 수가 없.. 2023. 2. 16.
@RequiredArgsConstructor 개념 이해하기 해당 어노테이션은 @Autowired를 대신해서 ~final이 붙은 필드나 @NonNull이 붙은 필드에 대해 생성자를 생성해주고 의존관계를 등록한다. @RequiredArgsConstructor을 사용하면 깔끔한 코드로 표현이 가능하다. @Component @RequiredArgsConstructor public class FacilityServiceImpl implements FacilityService{ private final FacilityRepository facilityRepository; } 정석적인 방법이다. 생성자 방식으로 Dependency Injection 하는 것을 직접 확인할 수 있다. @RequiredArgsConstructor 대신 @Autowired를 사용하여 대체한다. @.. 2023. 2. 16.
728x90