전체 글

전체 글

    [Spring] AOP에 대해 (2)

    AOP에 대해 (2) 템플릿 콜백 패턴을 이용해서 로그 추적기를 적용했었다. 이번에는 프록시 패턴을 이용해서 원본 코드에 손대지 않고 로그 추적기를 적용해보도록 하겠다. 3가지의 각기 다른 버전의 예를 가지고 진행하겠다. 인터페이스를 구현하고, 수동으로 빈 등록 인터페이스 없는 구체 클래스, 수동으로 빈 등록 인터페이스 없는 구체 클래스, 컴포넌트 스캔을 이용하여 빈 등록 다음과 같은 형태이며, V3는 일반적으로 사용하는 @Controller, @Service,@Repository를 이용한 클래스다. V2는 위의 어노테이션만 빠진 상태이고, AppV2Config에서 빈을 등록해주고 있다. @Configuration public class AppV2Config { @Bean public BepozContr..

    [Spring] AOP에 대해 (1)

    AOP에 대해 (1) @RestController @RequiredArgsConstructor public class BepozController { private final BepozService bepozService; @GetMapping("/request") public String request(String itemId) { bepozService.save(itemId); return "ok"; } } @Service @RequiredArgsConstructor public class BepozService { private final BepozRepository bepozRepository; public void save(String id) { bepozRepository.save(id); }..

    [Java] ThreadLocal에 대해

    ThreadLocal에 대해 ThreadLocal은 무엇일까? 코드로 먼저 확인해보자 public class Shared { private String nonDuplicatableId; public void responseYourId() { allocate(); System.out.println(nonDuplicatableId); } private void allocate() { if (nonDuplicatableId == null) { nonDuplicatableId = UUID.randomUUID().toString().substring(0, 6); } } } class SharedTest { private static final Shared shared = new Shared(); private s..

    [Spring] HttpComponentsCllientHttpRequestFactory를 이용한 RestTemplate 사용에 대해

    HttpComponentsCllientHttpRequestFactory를 이용한 RestTemplate 사용에 대해 RestTemplate을 선언할 때에 new RestTemplate() 다음과 같이 선언해서 이용할 수가 있다. 그런데 이용법에 대한 구글링을 찾다보니 HttpComponentsClientHttpRequestFactory를 생성자 파라미터로 넘겨주어 RestTemplate을 생성하는 코드를 찾아볼 수가 있었다. 다음과 같이 말이다. HttpComponentsClientHttpRequestFactory factory = new HttpComponentsClientHttpRequestFactory(); HttpClient client = HttpClientBuilder.create() .set..

    [JPA] OSIV와 Spring Framework에서의 OSIV에 대해서

    OSIV와 Spring Framework에서의 OSIV에 대해서 스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다. 트랜잭션이 시작할 때 영속성 컨텍스트를 생성하고 트랜잭션이 끝날 때 영속성 컨텍스트를 종료한다. 보통 비즈니스 로직을 시작하는 서비스 계층에 @Transactional 어노테이션을 선언해서 트랜잭션을 시작한다. 이 어노테이션으로 인해 트랜잭션 AOP가 동작을 하고, 트랜잭션을 커밋하면 JPA는 flush로 변경 내용을 데이터베이스에 반영한 후에 데이터베이스 트랜잭션을 커밋한다. 예외 발생 시에는 트랜잭션을 롤백하고 종료한다. 이 때에는 flush를 호출하지 않는다. 트랜잭션이 같으면 같은 영속성 컨텍스트를 사용한다. 트랜잭션이 다르면 다른 영속성 컨텍스트를 사용한다..

    [Spring] @Async를 이용한 비동기 처리에 대해

    @Async 를 이용한 비동기 처리에 대해 @Async 는 비동기적으로 처리를 할 수 있게끔 스프링에서 제공하는 어노테이션이다. 해당 어노테이션을 붙이게 되면 각기 다른 쓰레드로 실행이 된다. 즉, 호출자는 해당 메서드가 완료되는 것을 기다릴 필요가 없다. 이 어노테이션을 사용하기 위해서는 @EnableAsync 가 달려있는 configuration 클래스가 우선적으로 필요하다. @Configuration @EnableAsync public class AsyncConfig { } By default, both Spring's @Async annotation and the EJB 3.1 @javax.ejb.Asynchronous annotation will be detected. -@EnableAs..

    쿼리 튜닝 미션 적용기

    쿼리 튜닝 미션 적용기 우테코 레벨 4의 새로운 미션으로 쿼리 최적화 미션이 나왔다. 이 적용기를 써보려 한다. 허접함 주의!!!! 쿼리가 그렇게 좋지 않습니다!!! 모수 테이블이 작아야 한다는 원칙도 잘 지키지 못했다!! 그냥 과정만 봐주세요 ㅎㅎ.. 연습 쿼리로 위의 요구사항이 주어졌다. 테이블 정보는 다음과 같았다. 요구사항을 일단 되는대로 쿼리를 짜보았다. select 연봉높은사원신상.사원번호, 연봉높은사원신상.이름, 연봉높은사원신상.연봉, 사원출입기록.지역, 직급.직급명, 사원출입기록.입출입구분, 사원출입기록.입출입시간 from ( select 사원.사원번호, 사원.이름, 연봉사원정보.연봉 from 사원 inner join ( select 급여.사원번호, 급여. 연봉 from 급여 inner j..

    [Flyway] 간략히 알아보는 Flyway 적용법

    간략히 알아보는 FlyWay 적용법 FlyWay? DB Migration Tool 도입하게된 이유는? 진행 중인 프로젝트에서 spring.jpa.hibernate.ddl-auto 속성을 update을 이용했었는데 운영서버와 개발서버 간의 문제가 간간히 발생했고, create 속성으로 두기에도 데이터가 계속해서 날라가는 단점이 있었다. validate 으로 두고 진행하니, 운영서버와 개발서버를 나누고 있는 상황에서 한 쪽에만 DDL, DML을 적용되는 실수가 발생할 수 있기에 이를 쉽게 관리하기 위해 사용했다. 또한, 버전 기록이 남아있어 변경 내역을 확인할 수가 있다는 장점이 있다. 적용법 build.gradle 의존성 추가 dependencies { implementation 'org.flywa..