같은 타입의 Bean이 2개 이상 일 때 @Autowired는 타입(Type)으로 조회하는데, 이때 선택된 빈이 2개 이상일 때 NoUniqueBeanDefinitionException: No qualifying bean of type ...에러가 발생한다. 예제를 위해 DiscountPolicy의 하위 타입인 FixDiscountPolicy와 RateDiscountPolicy를 스프링 빈으로 선언해보자. @Component public class FixDiscountPolicy implements DiscountPolicy { } @Component public class RateDiscountPolicy implements DiscountPolicy { } 여기서 다음과 같이 의존관계 자동 주입을 실..
싱글톤(Sigleton) 싱글톤 패턴은 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. 그렇기 때문에 private 생성자를 사용해서 외부에서 new 키워드로 객체를 2개 이상 생성하지 못하도록 막아야 한다. 싱글톤 컨테이너(Sigleton Container) 스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤(1개만 생성)으로 관리한다. 스프링 컨테이너는 싱글턴 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리한다. 스프링 컨테이너는 싱글톤 컨테이너 역할을 한다. 이렇게 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다. 스프링 컨테이너의 이런 기능 덕분에 싱글턴 패턴의 모든 단점을 해결하면서 객체를 싱글톤으로 유지할 수 있다. 싱글..
Bean Validation Bean Validation은 특정한 구현체가 아니라 Bean Validation 2.0(JSR-380)이라는 기술 표준이다. 쉽게 이야기해서 검증 애노테이션과 여러 인터페이스의 모음이다. 마치 JPA가 표준 기술이고 그 구현체로 하이버네이트가 있는 것과 같다. Bean Validation을 구현한 기술중에 일반적으로 사용하는 구현체는 하이버네이트 Validator 이다. 이름이 하이버네이트가 붙어서 그렇지 ORM과는 관련이 없다. 의존관계 추가 Bean Validation을 사용하려면 build.gradle에 의존관계를 추가해야 한다. implementation 'org.springframework.boot:spring-boot-starter-validation..
Interceptor 스프링 인터셉터도 서블릿 필터와 같이 웹과 관련된 공통 관심 사항을 효과적으로 해결할 수 있는 기술이다. 서블릿 필터가 서블릿이 제공하는 기술이라면, 스프링 인터셉터는 스프링 MVC가 제공하는 기술이다. 둘다 웹과 관련된 공통 관심 사항을 처리하지만, 적용되는 순서와 범위, 그리고 사용방법이 다르다. 인터셉터의 흐름은 다음과 같다. HTTP 요청 ->WAS-> 필터 -> 디스패처 서블릿 -> 스프링 인터셉터 -> 컨트롤러 스프링 인터셉터는 디스패처 서블릿과 컨트롤러 사이에서 컨트롤러 호출 직전에 호출 된다. 스프링 인터셉터는 스프링 MVC가 제공하는 기능이기 때문에 결국 디스패처 서블릿 이후에 등장하게 된다. 아래는 인터셉터로 제한을 적용했을 때, 흐름이다. HTTP 요청 -> WA..
준영속 상태 준영속 상태란, 영속상태의 엔티티가 영속성 컨텍스트에서 분리된 것이다. 준영속 상태가 되면 영속성 컨텍스트가 제공하는 기능(dirty checking)을 사용하지 못한다. 준영속 상태로 만드는 방법 em.detach(entity) 특정 엔티티만 준영속 상태로 전환한다. Member findMember = em.find(Member.class, 2L); // 현재 member의 name은 hello이다. findMember.setName("hyuuny"); // findMember를 준영속 상태로 변경한다. em.detach(findMember); System.out.println("member : " + findMember); tx.commit(); findMember의 name을 "hyuu..
플러시(flush 플러시(flush)는 영속성 컨텍스트의 변경 내용을 데이터베이스에 반영하는 것이다. 데이터베이스 transaction commit이 발생하면 자동 플러시(flush)가 발생한다. 플러시는 영속성 컨텍스트의 변경 내용을 데이터베이스에 동기화하는 것이지 영속성 컨텍스트를 비우는 것은 아니다. transaction이라는 작업 단위가 있기 때문에 플러시(flush)가 동작 가능한것이다. 플러시(flush) 발생 플러시(flush)가 발생하면 다음과 같은 일이 발생한다. 1. 변경 감지(Dirty checking) 발생 2. 수정된 엔티티의 내용을 쓰기 지연 SQL 저장소에 등록 3. 쓰기 지연 SQL 저장소의 query를 데이터베이스에 전송(등록, 수정, 삭제) 영속성 컨텍스트 플러시(flus..
의존성 주입 DI는 디자인 패턴으로 크게 다음과 같이 4가지 방법이 있다. 생성자 주입 setter 주입 필드 주입(@Autowired) 일반 메서드 주입 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법 생성자 호출 시점에 단 1번만 호출되는 것이 보장된다. 불변, 필수 의존 관계에 사용 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepos..
Servlet Filter 필터는 서블릿이 지원하는 문지기와 같다. 만약 로그인한 회원만 게시판의 글 쓰기, 수정, 삭제 기능을 사용할 수 있다면, 해당 로직마다 로그인을 확인하는 기능을 추가해야 하고, 이 기능이 수정되었다면, 일일이 다 찾아서 수정도 해야 한다. 이러한 공통 관심사는 스프링의 AOP로 해결할 수 있지만, 웹과 관련된 공통 관심사는 서블릿 필터 또는 스프링 인터셉터를 사용하는 것이 좋다. 필터의 흐름은 다음과 같다. HTTP 요청 -> WAS -> 필터 -> 디스패처 서블릿 -> 컨트롤러필터를 적용하면 필터가 호출 된 다음에 디스패처 서블릿이 호출된다. 그래서 모든 고객의 요청 로그를 남기는 요구사항이 있다면 필터를 사용하면 된다. /* 이라고 하면 모든 요청에 필터가 적용된다. 아래는..
- Total
- Today
- Yesterday
- 문자열
- kotlin
- 북클럽
- webflux
- 인프런
- leetcode
- MySQL
- Real MySQL
- 노마드
- Algorithm
- 리팩토링
- 노마드코더
- 알고리즘
- 정렬
- 스프링
- 파이썬
- 김영한
- 스프링부트
- 스프링 부트
- 구현
- mysql 8.0
- 그리디
- 릿코드
- 데이터베이스
- 코틀린
- 코테
- 자료구조
- Spring
- 백준
- spring boot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |