본문 바로가기

JPA10

서비스 계층에서 @Transactional 이 없는데 디비 저장이 가능했던 이유 강의를 보다가 문득 다음과 같은 코드를 발견했습니다. 보통 서비스 계층에서 @Transactional 을 통해서 감싸주는게 일반적이였습니다. Repository 도 역시 아무것도 없습니다. 어떻게 저 save 문이 잘 동작했던 것일까? 결론부터 이야기 하면 @Transactional이 없는데 디비저장이 된다는것이 아닙니다. 즉, @Transactional이 있습니다.. 어디에 있는지는 디버깅을 천천히 해보면서 따라가보겠습니다. 처음에 UserRepository에 어떤 구현체가 주입되는지 살펴보면 SimpleJpaRepository 를 주입받습니다. 그래서 SimpleJpaRepository 의 save를 살펴보면 네 존재합니다. 마찬가지로 @Repository 어노테이션도 SimpleJpaReposito.. 2022. 3. 29.
[일지] Category는 삭제할 수 없다고?? 먼저 도메인 모델을 보자. Category 에서는 CategoryStore를 일대다로 참조하고 있으며, Store 에서는 CategoryStore를 일대다로 참조하고 있다. 또한 Store 에서는 categoryStoreList를 cascade = CascadeType.ALL 옵션을 주었다. 왜?? 만약 가게 사라진다면 가게와 연결해 있던 카테고리들을 모두 삭제해야하기 때문이다. 예시 데이터를 먼저 넣어보자. 여기서 "연우김밥"가게를 삭제해보자. 그러면 어떻게 될까?? 원하는 대로 잘 된다! 다시 원상 복귀하자. 그렇다면 여기서 김밥이라는 카테고리를 삭제하면 김밥을 참조하고있는 categoryStore도 삭제해야 될 것이다. 그래서 카테고리에 아래처럼 해주고 "김밥"을 삭제하면 category_store.. 2020. 9. 2.
[일지] Static 메서드로 생성하는 객체가 자동으로 save?? 요구 사항을 아래 처럼 정리 하였다. 가게는 카테고리 여러개를 가지고 있을 수 있다. 카테고리는 여러개의 가게를 가질 수 있다. 카테고리는 0개이상의 여러개의 자식을 가질수 있고 하나의 부모 혹은 부모를 가지지 않을 수 있다. 이를 그림으로 나타내면 이렇게 일대다 와 다대일로 풀어서 나타낼 수 있다. 개발 공부를 하던중 재밌는 사실을 하나 발견했는데 과정을 이야기 하겠다. Store와 Category를 연결하려는 작업을 하는데 자식 하나만 연결하면 자동으로 부모의 카테고리 까지 모두 포함시키는 함수를 작성하고자 했다. 위 처럼 카테고리와 가게를 넘기면 카테고리와 가게를 연결하는 categoryStore를 생성하는데 만약 category의 부모가 있다면 재귀로 호출하는 것이다. 만약 부모까지 적용해버리는 .. 2020. 9. 1.
[후기] 스프링 부트와 AWS로 혼자 구현하는 웹서비스 저자의 깃허브 주소: https://github.com/jojoldu/freelec-springboot2-webservice jojoldu/freelec-springboot2-webservice Contribute to jojoldu/freelec-springboot2-webservice development by creating an account on GitHub. github.com 개발의 큰 흐름을 파악하는데 큰 도움이 되었다. 물론 Spring Security 은 내부 구조는 어렵다... 책에서 얻을 수 있었던 지식들을 정리해본다. # 개발의 큰 흐름 파악 도메인과 레포지토리부터 개발 (Posts 도메인과 스프링 데이터 jpa 사용) api 개발 2-1. 도메인에 비즈니스 로직을 처리 2-2. .. 2020. 8. 29.
[일지] JPA Auditing 안먹는 이유는? 일반적으로 생성시간과 수정시간을 자동으로 등록하는데 이러한 설정이 먹히기 위해서는 Application이 실행되는 main 함수가 있는 클래스에 @EnableJpaAuditing 을 추가해줘야한다. 매번 까먹어서 적어둔다. 2020. 8. 25.
[JPA] 일대다 조인할때 영속성 컨텍스트 내부 모습 & distinct 엔티티와 데이터베이스를 매핑을 아래와 같이 한다. @Entity class User{ ... @ManyToOne(fetch = FetchType.LAZY ) private Team team; ... } @Entity class Team{ @OneToMany(mappedBy = "team") // 기본적으로 LAZY private List users = new ArrayList(); ... } 데이터 베이스는 미리 데이터를 인서트 해놓았다. 팀을 기준으로 유저들을 join 하면 재밌는 일이 발생한다. 즉 아래와 같은 코드가 있을때 출력을 생각해보자. List teams = em.createQuery("select t from Team t join fetch t.users").getResultList(); .. 2020. 8. 6.
[JPA / JPQL] @ManyToOne, @OneToOne 과 묵시적 조인 JPQL 은 엔티티를 대상으로 날리는 sql 과 비슷하다. JPQL에서 주의해야할 점이 있다. 만약 User 라는 객체에 Team이라는 객체가 @ManyToOne으로 매핑되었다고 가정하자. 유저마다 유저가 속한 팀을 가져오라는 쿼리는 다음과 같다. select u.team from User u ; 그러면 당연하게 받아 들일 수도 있다. 하지만 실제 sql 을 보면 JOIN문이 들어가 있다. 그럴수 밖에 없다. 유저의 팀을 가져오려면 유저와 팀을 조인해야한다. 이를 JPQL에서는 묵시적으로 조인해준다. 실제 날리는 쿼리는 아래와 같다. select t from User u join u.team t 이처럼 단일값을 연관관계로 가지는@ManyToOne 이나 @OneToOne 에서 "." 을 이용하여 가져온다면.. 2020. 8. 6.
[JPA] EntityManager 명령어 정리 find(class이름,기본키) 해당하는 객체를 영속성 컨텍스트로 가져온다. 영속성 컨텍스트에 이미 객체가 있다면 객체를 그대로 반환한다. 객체가 프록시객체라면 프록시 객체를 반환한다. (동일성 보장) persist(object) 객체를 영속화 한다. 영속성 컨텍스트에 객체를 저장한다. remove(object) 영속성 컨텍스트에서 객체를 제거한다. createQuery(jpql) jpql을 sql로 쿼리를 생성해 데이터베이스에 전송한다. detach(object) 영속상태의 객체를 비영속상태로 만든다. clear 영속성 컨텍스트를 비운다. flush 영속성 컨텍스트의 내용과 데이터베이스의 내용을 동기화한다. close 영속성컨텍스트를 더이상 관리하지 않는다. 2020. 8. 6.
[JPA] 영속성과 영속성 컨텍스트 영속성 컨텍스트에 관한 언급은 공식사이트에도 있다. https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html EntityManager (Java(TM) EE 7 Specification APIs) Interface used to interact with the persistence context. An EntityManager instance is associated with a persistence context. A persistence context is a set of entity instances in which for any persistent entity identity there is a unique entity i.. 2020. 8. 6.