본문 바로가기

Spring27

[Spring] @Transactional - 1 전파 레벨(propagation) @Transactional 사용시 주의사항 @Transactional을 클래스 또는 메소드 레벨에 명시하면 해당 메소드 호출시 지정된 트랜잭션이 작동하게 된다. 단, 해당 클래스의 Bean을 다른 클래스의 Bean에서 호출할 때만 @Transactional을 인지하고 작동하게된다. Propagation.REQUIRED @Transactional(propagation = Propagation.REQUIRED) public void doSomething() { ... } default 값이기 때문에 생략가능 부모 트랜잭션 내에서 실행하며, 부모 트랜잭션이 없을 경우 새로운 트랜잭션 생성 해당 메소드를 호출한 곳에서 별도의 트랜잭션이 설정되어 있지 않다면 트랜잭션을 새로 시작한다.(새로운 연결을 생성하고 실행.. 2020. 7. 6.
[Spring] 스프링 AOP with (프록시 패턴) 인프런 백기선님의 예제로 배우는 스프링 입문 (개정판) 강좌를 참고해 정리한 글 입니다. 내가 알기로 AOP는 공통 로직을 줄이기 위해 사용한다고 알고있다. 어떻게?? 찾아보자. AOP란? 어플리케이션 전체에 걸쳐 사용되는 기능을 재사용하도록 지원 핵심적인 기능에서 부가적인 기능을 분리하여 Aspect라는 모듈로 만들어 설계하고 개발하는 방법이다. 각각의 클래스를 부가기능의 관점에서 바라보았을 때 공통된 요소를 추출하는것(로깅, 트랜잭션, 보안) 가로 영역의 공통된 부분을 잘라냈다고 하여, AOP를 크로스 컷팅(Cross-Cutting)이라고 부르기도 한다. 장점 어플리케이션 전체에 흩어진 공통 기능이 하나의 장소에서 관리된다. 다른 서비스 모듈이 본인의 목적에만 충실하고 그외 사항은 신경쓰지 않아도 된.. 2020. 6. 30.
[Spring] Bean LifeCycle 솔직하게 말해서 기존에는 LifeCycle이 왜 중요한지 체감을 못했다. 단순히 중요하다니까 보는정도? 하지만, JPA를 공부하다보니 Entity의 LifeCycle이 엄청 중요했다. 그래서 LifeCycle에 대한 공부를 하려한다. Spring Bean의 생명주기 Spring Application 시작 Bean 설정파일 초기화 Config 파일이나 web.xml을 사용해 Bean으로 등록할 대상을 찾아 기본 생성자를 호출하여 Bean에 등록한다. Bean으로 등록할 객체 초기화 //@Component를 사용 할 경우 @PostConstruct public void init() { System.out.println("Init"); } //@Bean을 사용 할 경우 @Bean(initMethod = "in.. 2020. 5. 11.
@Bean vs @Component @Component와 @Bean 둘 다 Spring Container에 Bean을 등록하도록 하는 어노테이션으로 알고있다. 그렇다면 둘의 차이점은 뭘까? 궁금해졌다. @Bean 개발자가 컨트롤이 불가능한 외부 라이브러리들을 Bean으로 등록하고 싶은 경우 사용된다. (ObjectMapper의 경우 ObjectMapper Class에 @Component를 선언할 수 없으니, ObjectMapper의 인스턴스를 생성하는 메소드를 만들고 해당 메소드에 @Bean을 선언해 등록한다.) 메소드로 return 되는 객체를 Bean으로 등록해준다. ObjectMapper란? 기본 POJO 또는 범용 JSON Tree Model에서 JSON을 읽고 쓰는 기능과 변환 수행을 위한 기능을 제공한다. 또한 다양한 스타일의 .. 2020. 4. 8.
[Spring] Constructor Injection 방식을 권장하는 이유 요즘 아무 생각 없이 의존성 주입을 @Autowired를 사용한 필드 주입 방식으로 작성하다보니, 인텔리제이에서 경고메시지를 보여줬다. Field injection is not recommended .. Always use constructor based dependency injection in your beans 또한 백기선님의 스프링 부트 강의를 듣고있었는데 단일 생성자이며, 그 생성자의 파라미터가 빈일경우 스프링이 생성자를 자동으로 주입해준다고하였다. @Autowired를 사용하지 않아도 된다. public class Member { private final ProductService productService; public Member(ProductService productService) { .. 2019. 12. 25.
Mybatis #과 $ 매핑기호의 차이점 이슈가 발생해서 수정 요청이 들어왔다. 쿼리 insert 하는 부분에서 컬럼에 바인딩 되는 값 안에 작은 따옴표(') 가 들어가 있는 경우 SQLException이 발생했다. 그래서 이 부분을 작은 따옴표가 있더라도 insert 하도록 수정하는 것이다. 소스코드는 내가 작성하지 않았지만, 나도 생각 없이 작성 했었을 것 같다. 알고보니 #, $에 따른 매핑기호로 인한 바인딩 방식 차이로 생긴 문제여서 SQLException에 대한 예외처리와 매핑기호를 $에서 #로 수정 해주어 해결됐다. 그럼 #과 $는 어떤점이 다를까? # #은 PreparedStatement를 의미한다. 예를들어 USER_ID = SeokHun 이고, 아래 쿼리가 실행된다면 SELECT USER_ID FROM USERS WHERE US.. 2019. 9. 4.