본문 바로가기
728x90

BackEnd24

빈 생명주기 콜백 빈 생명 주기 콜백 시작 데이터베이스 커네션 풀이나, 네트워크 소켓 처럼 어플리케이션 시작 시점에 필요한 열결을 미리 해두고, 어플리케니션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요하다. 스프링 빈은 객체를 생성하고 의존 관계 주입이 다 끝난 다음에야 필요한 데이터를 사용할 수 있는 준비가 완료된다. 따라서 초기화 작업은 의존 관계 주입이 모두 완료도히고 난 다음에 호출해야 한다. 의존 관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주는 다양한 기능을 제공한다. 또한 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 알려줘서 안전하게 초기화와 소멸 작업을 할 수 있다. 스프링 빈의 이벤트 라이프사이클 스프링 컨테이너 생성 → 스프링 빈.. 2022. 12. 18.
의존 관계 자동 주입 다양한 의존 관계 주입 방법 생성자 주입 수정자 주입(setter) 필드 주입 일반 메서드 주입 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법 생성자 호출시점에 딱 1번만 호출되는 것이 보장 불변, 필수 의존 관계에 사용 @Component public class OrderServiceImpl implements OrderService { private MemberRepository memberRepository; private DiscountPolicy discountPolicy; // 생성자가 딱 1개만 있으면 @Autowire 생략 가능 @Autowire public OrderServiceImpl(MemberRepository memberRepository, DiscountP.. 2022. 12. 18.
싱글톤 컨테이너 싱글톤 컨테이너 싱글톤 패턴 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴 웹 어플리케이션은 보통 여러 고객이 동시에 요청을 함. 예를 들어 고객 트래픽이 초당 100이면 100개의 객체가 생성이되고 소멸이 되어 메모리 낭비가 심함 이러한 문제를 해결하기 위해 객체가 딱 1번만 생성되어 공유하도록 하는 싱글톤 패턴이 나옴 객체가 2개 이상 생성되는 것을 막기 위해 constructor의 접근자를 private 으로 사용해야 함. 생성자를 private으로 만들면 new 키워드를 사용하여 인스턴스 생성을 하지 못 함 싱글톤의 패턴의 문제점 싱글톤 패턴을 구현하는 코드 자체가 많이 들어감 의존관계상 클라이언트가 구현체 클래스에 의존. DIP 위반, OCP 위반 가능성 높아짐 테스트하기가 .. 2022. 12. 18.
OOP 5가지 원칙 SOLID과 IoC, DI SRP - Single Responsibility Principle 한 클래스는 단일의 책임만 가져야 함 중요한 기준은 변경임. 변경이 있을 때 파급 효과가 적으면(수정할 부분이 적으면) 단일 책임 원칙을 잘 따른 것 결제 기능으로 예를 들면 payment는 PaymentService, TMS는 TmsService 이렇게 기능별로 분리해주는 것이 좋음. 분리를 하게 되면 서로 수정을해서 충돌이 날 확률이 적어지고 역할에 해당하는 서비스를 찾기 쉬움 OCP - Open/Closed Principle 클래스나 모듈은 확장에는 열려있고, 변경에는 닫혀있어야 함 다형성을 활용하여 인터페이스를 구현한 새로운 클래스를 하나 만들어 새로운 기능을 구현하는것이 좋음 객체를 생성하고 연관관계를 맺어주는 별도의 조립자, .. 2022. 12. 18.
QueryDsl에서 exists과 동일한 성능을 낼 수 있는 fetchOne 바로 전 글에서 유저가 모임을 생성할 때 해당 일에 00:00 ~ 23:00시 까지 유저의 일정을 불러오는 부분을 구현 했다면 이번에는 유저가 모임을 생성하려는 시간에 겹치는 일정이 있는지 없는지 체크해서 겹치는 시간이 있으면 생성을 막는 기능을 구현 하려 한다. 전에 만들었던 query를 사용해서 java에서 겹치는 시간이 있는지 없는지 체크를해도 되지만 따로 query를 만들어서 체크를 하기로 했다. 밑 query는 mysql에서 exists 사용 예제다. select exists ( select * from group_table where group_id = 2 ) 하지만 QueryDsl에서는 from절이 필수이기 때문에 저렇게 사용하지 못 한다. 그래서 exists와 동일한 성능을 낼 수 있는 q.. 2022. 9. 27.
QueryDsl에서 MySQL Function 사용하기 부트캠프에서 팀 프로젝트를 진행하면서 QueryDsl을 사용하게 되었다. 마지막 기능 구현 부분인 모임의 일정 기능 구현을 진행하다가 유저가 모임 일정을 생성하려는 경우 일 별로 유저가 모임을 참여했거나, 모임을 생성한 시간들을 데이터 베이스에서 가져와서 일정이 겹치는 경우 생성을 막아줘야하는 부분을 구현해야 할 것 같아서 QueryDsl에서 MySQL Function을 사용 해야 할 일이 생겨버렸다.. 처음에는 당연히 MySQL의 함수를 쓸 수 있을거 같아서 바로 쓴 결과는 실패였다. No data type for node: org.hibernate.hql.internal.ast.tree.MethodNode 위 내용으로 구글링을 한 결과 dialect를 extends한 CustomDialect를 만들어.. 2022. 9. 27.
728x90