Back-End 108

[스프링 핵심 원리 - 기본편] 빈 생명주기 콜백

빈 생명주기 콜백 시작 데이터베이스 커넥션 풀이나, 네트워크 소켓처럼 애플리케이션 시작 시점에 필요한 연결을 미리 해두고, 애플리케이션 종료 시점에 연결을 모두 종료하는 작업을 진행하려면, 객체의 초기화와 종료 작업이 필요. 밑 Network는 애플리케이션 시작 시점에 connect()를 호출해서 연결을 맺어두어야 하고, 애플리케이션이 종료되면 disConnect()를 호출해서 연결을 끊어야 함. private String url; public NetworkClient(){ connnect(); call("초기화 연결 메시지"); } public void setUrl(String url){ this.url = url; } //서비스 시작시 호출 public void connect(){ } public v..

[스프링 핵심 원리 - 기본편] 의존관계 자동 주입

다양한 의존관계 주입 방법 의존관계 주입은 크게 4가지 생성자 주입 수정자 주입(setter 주입) 필드 주입 일반 메서드 주입 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입받는 방법이다. 특징 생성자 호출 시점에 딱 1번만 호출되는 것이 보장된다. 불변, 필수 의존 관계에 사용 private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy discountPolicy){ this.memberRepository = memberReposito..

[스프링 핵심 원리 - 기본편] 컴포넌트 스캔

컴포넌트 스캔과 의존관계 자동 주입 시작하기 지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean이나 XML의 등을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열 이렇게 등록할 스프링 빈이 많아지면 일일이 등록하기 귀찮고, 설정 정보도 커지고, 누락하는 문제도 발생한다. 그래서 스프링은 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 컴포넌트 스캔이라는 기능을 제공 또 의존 관계도 자동으로 주입하는 @Autowired라는 기능도 제공한다. AutoAppConfig.java @Configuration @CompenentScan( excludeFilters = @Filter(type = FilterType.ANNOTATION, classes = Configuration.class) ) public ..

[스프링 핵심 원리 - 기본편] 싱글톤 컨테이너

웹 애플리케이션과 싱글톤 스프링은 태생이 기업용 온라인 서비스 기술을 지원하기 위해 탄생 대부분의 스프링 애플리케이션은 웹 애플리케이션. 물론 웹이 아닌 애플리케이션 개발도 얼마든지 개발할 수 있음. 웹 애플리케이션은 보통 여러 고객이 동시 요청 고객 요청이 올 때마다 새로운 memberService 생성함. 우리가 만들었던 스프링 없는 순수한 DI 컨테이너인 AppConfig는 요청을 할 때마다 객체를 새로 생성 고객 트래픽이 초당 100이 나오면 초당 100개 객체가 생성되고 소멸됨 -> 메모리 낭비가 심함 해결방안은 해당 객체가 딱 1개만 생성되고, 공유하도록 설계하면 된다. -> 싱글톤 패턴 싱글톤 패턴 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. 그래서 객체 인스턴스를..

DAO와 Mapper 인터페이스

1. DAO란? Data Access Object의 약어로 실질적으로 DB에 접근하여 데이터를 조회하거나 조작하는 기능을 전담하는 객체를 말한다. DAO의 사용 이유는 효율적인 커넥션 관리와 보안성 때문이다. DAO는 저수준의 Logic과 고급 비즈니스 Logic을 분리하고 domain logic으로부터 DB 관련 mechanism을 숨기기 위해 사용한다. 2. Mapper란? MyBatis 매핑 XML에 기재된 SQL을 호출하기 위한 인터페이스이다. 3. Mapper 인터페이스를 사용하지 않을 경우 SQL Session을 등록해줘야 한다. DAO 인터페이스와 인터페이스를 구현한 DAO클래스를 생성해줘야한다. Mapper인터페이스를 사용하지 않았을 때는 네임스페이스 + "." + SQL ID로 지정해서 ..

Back-End/Study 2022.08.14

@RequiredArgsConstructor - Dependency Injection

@RequiredArgsConstructor 초기화되지 않은 final 필드나, @NonNull이 붙은 필드에 대해 생성자를 생성해 줌. 주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용되곤 한다. final 필드에 대해 생성자를 만들어주는 lombok의 annotation Spring Framework의 DI(의존성 주입) 중 Constructor Injection(생성자 주입)을 임의의 코드 없이 자동으로 설정 @RequiredArgsConstructor 적용 전 @Component public class LombokTest { private final MyService myservice; private final String id; @Autowired public Lom..

Back-End/Study 2022.08.11

DAO와 Repository 차이

영구 저장소 API 문제점 우리는 MySQL, Oracle, MongoDB 등 다양한 영구 저장소의 구현체를 사용해왔다. 그리고 어플리케이션에서 이러한 저장소에 접근하기 위해 벤더별로 저장소에서 제공하는 API를 통해 접근해왔다. 이 과정에서 어떤 문제가 있었을까. 구현체와 로직의 강한 결합 문제 만약 MySQL과 같은 특정 벤더의 영구 저장소를 사용하고 있을 때, Oracle로 변경해야 한다면 MySQL의 API를 사용한 모든 구현을 변경해주어야 하는 불편함이 생긴다. 계층 간 간섭 문제 레이어가 깨지는 문제는 결국 강한 결합 문제로 연결된다. MySQL의 API를 서비스 로직에서 사용했을 경우, 서비스 로직과 DB와 관련된 API가 강한 결합을 가지게 되어 영속성과 관련된 로직이 서비스 로직에 영향을..

Back-End/Study 2022.08.10

Lombok 라이브러리 어노테이션

@Getter @Setter 각각 접근자와 설정자 메서드를 작성해주는 Lombok 어노테이션으로 유명하다. 또, 생성자를 자동 생성해주는 Lombok 어노테이션에는 @NorgsConstructor 파라미터가 없는 기본 생성자 생성 @AllArgsConstructor 모든 필드 값을 파라미터로 받는 생성자를 만들어 줌 @RequiredArgsConstructor final이나 @NonNull인 필드 값만 파라미터로 받는 생성자를 만들어 줌 toString() 메소드를 작성하는 일도 @ToString 어노테이션만 붙여주면 자동으로 생성해 줌 @ToString(exclude = "id")와 같이 exclude를 사용하면 toString() 결과에서 id를 제외시킬 수 있음 //사용할 때 User user = ..

Back-End/Study 2022.08.04

JPAQueryFactory

쿼리 만들기 QueryDSL을 사용하기 위해서는 먼저 QueryDSL이 제공하는 JPAQueryFactory 클래스의 인스턴스를 생성해야 한다. JPAQuertFactory queryFactory = new JPAQueryFactory(em); EntityManager를 ㅈ입하여 인스턴스를 생성해야 함 Spring Boot를 사용하면 다음과 같이 QueryFactory를 각 로직마다 주입해 줄 필요 없이 필드로 빼도 동시성 문제없이 각각 별도의 영속성 컨텐스트를 제공받아 작동함 @SpringBootTest @Transactional public class QueryDslBasicTest{ @Autowired EntityManager em; JPAQueryFactory queryFactory; public..

Back-End/Study 2022.08.01