Back-end Skill/Springboot

Hibernate JPA 사용할 때 주의해야할 점. 원리를 모르면 그냥 쓰지마세요 1편

Sophie소피 2022. 10. 5. 16:25

QueryDSL??

QueryDSL은 정적 타입을 이용해서 SQL 등의 쿼리를 생성해주는 프레임워크이다.

QueryDSL의 장점

  1. 문자가 아닌 코드로 쿼리를 작성함으로써, 컴파일 시점에 문법 오류를 쉽게 확인할 수 있다.
  2. 자동 완성 등 IDE의 도움을 받을 수 있다.
  3. 동적인 쿼리 작성이 편리하다.
  4. 쿼리 작성 시 제약 조건 등을 메서드 추출을 통해 재사용할 수 있다.

잘못된 예제코드와 정상예제코드 작성을 통해 학습해보기


간단하게 entity가 두개가 있다.

이 둘은 양방향 관계이다.

일대다 양방향 관계이다.

Entity01 BookStore

@Entity
@Getter @Setter 
public calss BookStore {
			@Id @GenerateValue
	private Integer id; 
	
	private String name; 

	@OneToMany(mappedBy ="bookStore")
	private Set<book> books = new HashSet<>();
			//add 메세지로 책을 책방에 추가한 것 
				void add(Book book){
				this.books.add(book);
			}
}

Entity02 Book

@Entity
@Getter @Setter 

public calss Book {
		@Id @GenerateValue
		private Integer id; 

		private String isbn; 

		private String title; 

		@ManytoOne
		private BookStore;

}

bookStore가 책방에.. 책이 많죠?

책방하나에 책이 여러권이 있습니다

각각 책들은 어떤 책방에 속해 있다.

그래서 ManyToOne으로 책방을 가지고 있다.

책방이 책을 여러개 가지고 있다.

testCode

@RunWith(SpringRunner.class)
@SpringBootTest
public class DemoJpaTestApplicationTests{
		@Autowired
		BookStoreRepository bookStoreRepository; 

		@Autowired
		BookRepository bookRepository; 

    @Test 
		public void contexLoads(){
				//책방 보이죠?? 책방을 하나 만들고 
				bookStore bookStore = new BookStore();
				bookStore.setName("소피 책방");
				bookStoreRepository.save(bookStore);
				
				//책을 만들었다.
				Book book = new Book(); 
				book.setTitle("JPA공부 좀 하면서 쓰자"); 

				// 그 다음에 이 책을 책방에다가 추가했어요. 
				bookStore.add(book); 

				bookRepository.save(book);
	}

}

근데 문제가 생긴다. 저렇게 실행 하면

결과가

book database

id title book_store_id

16 <null> <null>
     

book_store_id가 설정이 안된다.

book_store database

id name

25 소피책방
   

책방에서는 책방에 대한 정보 밖에 없고 연관관계가 매핑 실패.

연관관계 정보가 들어가질 않습니다.

자 이게 문제이다.

양방관계에서 꼭 !! 주의해아하는 점이 있다!

이걸 이해하지 못하고 넘어간다면 데이터가 제대로 저장이 안되거나

데이터가 제대로 삭제가 안되거나 그런일이 비일비재하게 일어난다.

그렇다면 해결 방법은??

댓글로 남겨주세요 . 

는 장난이고요 내일 공개합니다.. 

백기선 선생님께서 위의 잘못된 예제코드에서 잘못된걸 찾지 못하면 

그냥 JDBC쓰라고 하시네요 ... 

하지만 난 쓰지않을거야 ,,,, 마이바티스 싫어 ,,, 싫어억!!!!!!!!!