스프링 구조 어플리케이션은 기본적으로 Components 간의 상호작용으로 동작하는데 Component 또는 Bean 형태로 스프링 컨테이너인 ApplicationContext 라는 DI 컨테이너에 올려두고 관리 되는 구조. ApplicationContext 와 Bean 등록 빈을 등록하는 방법은 위와 같이 annotation 기반으로 등록하거나 xml 파일로 등록할 수 있다. 위와 같이 스프링 컨테이너에 빈을 등록하면 실제 어플리케이션이 동작할 때 의존성 주입 (DI) 을 기반으로 해서 스프링이 관리하는 빈으로 변경되어 수행된다. @Configuration // Coonfiguration 또한 Component 이다. public class AppConfig { @Bean public UserServi..
JPA로 작성되었던 기존 CustomRepository Interface를 상속받은 RepositoryImpl을 QueryDsl 로 복잡한 쿼리를 해결하고 V2로 넘어가는 과정에서 문제가 발생하였다. 기존 OrderRepositoryImpl를 남기고 싶어서 v1,v2 따로 나누기위해 Class 이름 뒤에 v1을 남기고 QueryDsl로 작성한 Repository의 뒤에 v2로 작성하여 돌렸더니 .. 두 시간 삽질을 했다 .. 쿼리가 잘 못 됬는지 확인해보고, 애노테이션도 확인해보고 삽질이란 삽질은 다 했다가 Repository 자체가 문제란걸 깨닫고 CustomRepository 규칙을 다시 보았다. 기본 Impl으로 설정되어있는 접미사가 있어야 있어야 Bean을 만드는 규칙이 있었다. 그리고 리플렉션 ..
엔티티에 대해 변경추적 이력을 넣고싶어서 JPA의 Auditing기능을 쓰는 과정에 이상한 점을 찾았다. @LastModifiedDate만 동작을 안함.. 이게 뭐지..? 하다가 엔티티 하나만 수정해보니 동작은 하는데 문제는 Item들이 전체 세일을 할때 동작을 안함 .. (2~12는 전체할인 기능동작 , 13는 하나만 수정) 아마 전체 할인 기능을 사용할 때 벌크성 쿼리를 날리는 과정에 DB에 바로 때려박아서 변경감지를 못하기 때문에 그런게 아닐까 싶다. 찾아보니 맞는거 같다.. 어쩔수 없이 TimeEntity에 별도의 로직을 추가 한 뒤에 벌크쿼리를 날리기전에 전체 업데이트 한번 한 뒤에 실행하니 수정날짜 바꾸기 동작함 결론 : 벌크성 쿼리는 추적할 생각하지말거나 직접 넣어주는 로직을 짜야함
혼자 스프링 토이프로젝트를 만들면서 JPA를 사용하던도중 엔티티간의 동일성에 대해 궁금증이 생겼다. 우선 , Member 엔티티를 하나 생성을 해서 저장 한 다음 그 ID값으로 find를 실행했을때 출력되는 값은 같음을 확인하였다. 하지만 만약 영속성 컨텍스트를 벗어난다면 ( entityManager를 flush,clear를 시킴 ) 같은 ID같으로 조회해서 가져온 엔티티는 보다시피 불 일치가 나온다. 같은 객체가 아니라는것. 이는 , 같은 엔티티라는 보장을 해 줄때 수정관련 작업에서 변경감지를 쿼리가 나가기전에 1차캐시에서 비교를 먼저 해 주고 만약 변경된 값이 있다면 데이터를 변경시키고 쿼리가 나가지만 영속성을 보장받지 못하면 다른 엔티티이기 때문에 변경감지가 동작하지 않는다. => 같은 ID값으로 ..
Spring 으로 토이프로젝트를 만들던 도중 예전에 해논 코드의 css가 그대로 가져왔더니 적용이 안되는 현상이 일어났다 .. 결론 : integrity 의 값이 현재 사용중인 부트스트랩 버젼과 일치 하지 않으면 Block 시켜버림. https://getbootstrap.com/docs/4.4/getting-started/introduction/ Introduction Get started with Bootstrap, the world’s most popular framework for building responsive, mobile-first sites, with jsDelivr and a template starter page. getbootstrap.com 여기 들어가서 link 태그 부분을 통째..
스프링 AOP에 대해 정리를 해보고자 한다. 1. AOP 개념? AOP란 Apsects Oriented Programming 으로, 관점 지향 프로그래밍의 약자이다. 어플리케이션은 로직은 크게 핵심기능과 부가 기능으로 나눌 수 있다. 실제 요청을 받아 들이고 처리하는 로직을 핵심기능이라고 하고 핵심 기능을 보조하여 가령 로그를 남겨주는 로직을 부가 기능이라고 한다. 가령 , 주문에 대한 로직이 있다고 가정하자. 그리고 각 컴포넌트에서 로그를 남겨주는 코드를 적용해야한다면 다음과 같이 각 컴포넌트에 로그를 일일이 남겨주는 로직을 핵심기능안에 넣어야 한다. 그런데 로그찍는 방법이 달라졌는데 컴포넌트가 100개가 넘는다면 ..? => 100개가 넘는 로직를 뜯어고쳐야한다. 로그추적과 같은 공통관심사를 핵심기능..