빈 후처리기 빈 후처리기는 빈을 생성한 후에 무언가를 처리하는 용도로 사용하는데, 객체를 조작하거나, 다른 객체로 바꿔치기 하는 기능을 제공하므로 스프링이 생성한 객체를 빈 저장소에 등록하기 직전에 조작하고 싶다면 빈 후처리기를 사용하면 된다. public interface BeanPostProcessor { Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException } 빈 후처리기를 사용하려면 BeanPostProcessor 인터페이스를 구현..
포인트컷 포인트컷은 어디에 부가 기능을 적용할지 판단하는 필터링 로직으로, 주로 클래스와 메서드 이름으로 필터링한다. 어떤 포인트(Point)에 기능을 적용할지 하지 않을지 잘라서(cut) 구분하는 것이라 이해하면 된다. public interface Pointcut { ClassFilter getClassFilter(); MethodMatcher getMethodMatcher(); } public interface ClassFilter { boolean matches(Class clazz); } public interface MethodMatcher { boolean matches(Method method, Class targetClass); //.. } 포인트컷은 크게 ClassFilter 와 Met..
프록시 팩토리 스프링은 유사한 구체적인 기술들이 있을 때, 그것들을 통합해서 일관성 있게 접근할 수 있고 편리하게 사용할 수 있도록 추상화된 기술을 제공한다. 동적 프록시를 통합해서 프록시 팩토리라는 기능을 제공하는데, 프록시 팩토리는 인터페이스가 있으면 JDK 프록시를 사용하고, 구체 클래스가 있다면 CGLIB를 사용한다. 이 내용은 설정을 통해 변경할 수도 있다. Advice Advice는 프록시에 적용하는 부가 기능 로직이다. JDK 동적 프록시가 제공하는 InvocationHandler와 CGLIB가 제공하는 MethodInterceptor의 개념과 유사한데, 이 둘을 추상화 한 것이다. 프록시 팩토리를 사용한다면 이 둘 대신에 Advice를 사용하면 된다. Advice를 만드는 방법은 다양하지만..
리플렉션 리플렉션은 클래스나 메서드의 메타정보를 동적으로 획득하고, 코드도 동적으로 호출할 수 있도록 하는 API이다. 리플렉션 적용 전 @Slf4j public class ReflectionTest { @Test void reflection0() { Hello target = new Hello(); // 공통 로직1 시작 log.info("start"); String result1 = target.callA(); // 호출하는 메서드가 다름, 동적 처리 필요 log.info("result={}", result1); // 공통 로직1 종료 // 공통 로직2 시작 log.info("start"); String result2 = target.callB(); // 호출하는 메서드가 다름, 동적 처리 필요 lo..
동시성 문제 스프링은 기본적으로 싱글톤 빈을 등록한다. 지역변수는 쓰레드마다 각각의 다른 메모리 영역이 할당되기 때문에 동시성 문제가 발생하지 않지만, 싱글톤으로 등록된 인스턴스의 필드를 여러 쓰레드가 동시에 접근하는 경우 문제가 발생한다. 또한 동시성 문제는 값을 읽기만 해선 발생하지 않고, 어디선가 값을 변경하기 때문에 발생한다. 아래와 같은 경우는 동시성 문제가 발생하는 코드이다. 코드를 살펴보며 문제를 확인해보자. FieldService 클래스 @Slf4j public class FieldService { private String nameStore; public String logic(String name) { log.info("저장 name={} nameStore={}", name, nameS..
트랜잭션 트랜잭션은 ACID라 하는 원자성(Atomicity), 일관성(Consistency), 격리성(Isolation), 지속성(Durability)을 보장해야 한다. 원자성 : 트랜잭션 내에서 실행한 작업들은 마치 하나의 작업인 것처럼 모두 성공 하거나 모두 실패해야 한다. 일관성 : 모든 트랜잭션은 일관성 있는 데이터베이스 상태를 유지해야 한다. 예를 들어 데이터베이스에서 정한 무결성 제약 조건을 항상 만족해야 한다. 격리성 : 동시에 실행되는 트랜잭션들이 서로에게 영향을 미치지 않도록 격리한다. 예를 들어 동시에 같은 데이터를 수정하지 못하도록 해야 한다. 격리성은 동시성과 관련된 성능 이슈로 인해 트랜잭션 격리 수준(Isolation level) 을 선택할 수 있다. 지속성 : 트랜잭션을 성공..
JDBC가 등장하게 된 이유 클라이언트가 애플리케이션 서버를 통해 데이터를 저장 또는 수정하면, 애플리케이션 서버는 아래와 같은 순서로 데이터베이스를 사용한다. 커넥션 연결 : 주로 TCP/IP를 사용해서 커넥션을 연결한다. SQL 전달 : 애플리케이션 서버는 DB가 이해할 수 있는 SQL을 연결된 커넥션을 통해 DB에 전달한다. 결과 응답 : DB는 전달된 SQL을 수행하고 그 결과를 응답한다. 애플리케이션 서버는 응답 결과를 활용한다. 과거에는 각 벤더사마다 커넥션을 연결하고, SQL을 전달 및 결과를 응답 받는 방법이 모두 다르기 때문에, 데이터베이스를 다른 벤더사로 변경하면 애플리케이션 코드도 그에 맞게 수정해줘야 하는 단점이 존재하였다. 또한 각 벤더사에 따라 커넥션 연결방법, SQL 전달방법,..
Config 기반 Bean 설정 @Configuration public class AppConfig { @Bean public MemberService memberService() { return new MemberServiceImpl(memberRepository()); } @Bean public MemberRepository memberRepository() { return new MemoryMemberRepository(); } @Bean public OrderService orderService() { return new OrderServiceImpl(memberRepository(), discountpolicy()); } @Bean public DiscountPolicy discountpolic..
싱글톤(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..
- Total
- Today
- Yesterday
- 인프런
- spring boot
- 노마드코더
- 코테
- Spring
- 스프링 부트
- webflux
- Real MySQL
- 스프링
- 리팩토링
- MySQL
- 파이썬
- 알고리즘
- 정렬
- 스프링부트
- 자료구조
- kotlin
- 릿코드
- Algorithm
- 백준
- leetcode
- 노마드
- 그리디
- 코틀린
- mysql 8.0
- 문자열
- 김영한
- 데이터베이스
- 북클럽
- 구현
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |