만약 서비스 계층이 JDBCRepository 구현체에 의존하고 있는 상황에서, 향후 JPA와 같은 다른 데이터 접근 기술로 변경하면 서비스 계층의 트랜잭션 관련 코드도 모두 변경해주어야 합니다.JDBC 트랜잭션 의존JDBC -> JPA로 변경이 문제를 해결하기 위해서는 트랜잭션 기능을 추상화하면 됩니다. 단순하게 생각해보면 아래와 같이 인터페이스를 만들어서 사용하면 될 것 입니다.public interface TxManager { begin(); commit(); rollback();}트랜잭션 추상화와 의존관계서비스는 특정 트랜잭션 기술에 직접 의존하는 것이 아니라, TxManager라는 추상화된 인터페이스에 의존하고 있습니다. 이제 원하는 구현체를 DI를 통해서 주입받기만 하면 되는데..
[Spring] 외부설정과 프로필 1 외부 설정 - 커맨드 라인 옵션 인수와 스프링 부트 스프링 부트는 커맨드 라인을 포함해서 커맨드 라인 옵션 인수를 활용할 수 있는 ApplicationArguments를 스프링 빈으로 등록해둔다. 그리고 그 안에 입력한 커맨드 라인을 저장해둔다. 그래서 해당 빈을 주입 받으면 커맨드 라인으로 입력한 값을 어디서든 사용할 수 있다. CommandLineBean @Slf4j @RequiredArgsConstructor @Component public class CommandLineBean { private final ApplicationArguments arguments; @PostConstruct public void init() { log.info("source {}..
템플릿 콜백 패턴 프로그래밍에서 콜백(callback) 또는 콜애프터 함수(call-after function)는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있다. 좀 더 풀어서 얘기하면, callback은 코드가 호출(call)은 되는데 코드를 넘겨준 곳의 뒤(back)에서 실행된다는 것이다. 템플릿 콜백 패턴은 GOF 패턴은 아니고, JdbcTemplate, RestTemplate, TransactionTemplate, RedisTemplate과 같이 스프링 내부에서 자주 사용된다. 이전에 살펴본 전략 패턴에서 템플릿과 콜백 부분이 강조된 패턴이라 생각하면 된다. 이번에도 역시 요리사들의..
전략 패턴 GOF에서는 전략 패턴을 "알고리즘 제품군을 정의하고 각각을 캡슐화하여 상호 교환 가능하게 만들자. 전략을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다"고 말한다. 이전에 템플릿 메서드 패턴은 부모 클래스에 변하지 않는 템플릿을 두고, 변하는 부분을 자식 클래스에 두어서 상속을 사용해서 문제를 해결했다. 전략 패턴은 변하지 않는 부분을 Context라는 곳에 두고, 변하는 부분을 Strategy라는 인터페이스를 만들고 해당 인터페이스를 구현하도록 해서 문제를 해결한다. 상속이 아니라 위임으로 문제를 해결하는 것이다. 이번에도 이해를 돕기 위해 요리사들의 요리 시작부터 완성하기까지의 시간을 측정해야 한다고 가정해보고, 전략 패턴을 적용하여 구현해보자. 전략 패턴..
템플릿 메서드 패턴 GOF에서는 템플릿 메서드 패턴을 "작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기한다. 템플릿 메서드를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의할 수 있다"고 말한다. 이 말은 부모 클래스에 알고리즘의 골격인 템플릿을 정의하고, 일부 변경되는 로직은 자식 클래스에 정의하는 것이다. 이렇게 하면 자식 클래스가 알고리즘의 전체 구조를 변경하지 않고, 특정 부분만 재정의할 수 있어 상속과 오버라이딩을 통한 다형성으로 문제를 해결하는 것이다. 이해를 돕기 위해 요리사들의 요리 시작부터 완성하기까지의 시간을 측정해야 한다고 가정해보고, 템플릿 메서드 패턴을 적용하여 구현해보자. 먼저 템플릿 메서드 패턴을 적용하기 전의 코드다...
동시성 문제 스프링은 기본적으로 싱글톤 빈을 등록한다. 지역변수는 쓰레드마다 각각의 다른 메모리 영역이 할당되기 때문에 동시성 문제가 발생하지 않지만, 싱글톤으로 등록된 인스턴스의 필드를 여러 쓰레드가 동시에 접근하는 경우 문제가 발생한다. 또한 동시성 문제는 값을 읽기만 해선 발생하지 않고, 어디선가 값을 변경하기 때문에 발생한다. 아래와 같은 경우는 동시성 문제가 발생하는 코드이다. 코드를 살펴보며 문제를 확인해보자. FieldService 클래스 @Slf4j public class FieldService { private String nameStore; public String logic(String name) { log.info("저장 name={} nameStore={}", name, nameS..
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..
의존성 주입 DI는 디자인 패턴으로 크게 다음과 같이 4가지 방법이 있다. 생성자 주입 setter 주입 필드 주입(@Autowired) 일반 메서드 주입 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법 생성자 호출 시점에 단 1번만 호출되는 것이 보장된다. 불변, 필수 의존 관계에 사용 @Component public class OrderServiceImpl implements OrderService { private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired public OrderServiceImpl(MemberRepository memberRepos..
스프링 메시지 소스 스프링은 기본적인 메시지 관리 기능을 제공한다. 메시지 관리 기능을 사용하기 위해서는 스프링이 제공하는 MessageSource를 스프링 빈으로 등록하면 되는데, 인터페이스이기 때문에 구현체인 ResourceBundleMessageSource를 스프링 빈으로 등록한다. 스프링 메시지 소스 직접 등록 @Bean public MessageSource messageSource() { ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource(); messageSource.setBasenames("messages", "errors"); messageSource.setDefaultEncoding("utf-8"); re..
- Total
- Today
- Yesterday
- 자료구조
- 코테
- 그리디
- 파이썬
- Algorithm
- Spring
- 스프링 부트
- kotlin
- webflux
- 알고리즘
- 스프링부트
- 노마드코더
- 김영한
- Real MySQL
- 백준
- MySQL
- leetcode
- 리팩토링
- 인프런
- 스프링
- 노마드
- 북클럽
- 데이터베이스
- 정렬
- 코틀린
- 문자열
- mysql 8.0
- 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 |