본문 바로가기

TIL

[TIL 2022-02-23] 지연로딩, 순열 알고리즘

즉시로딩과 지연로딩

연관관계 매핑을 통해 @ManyToOne, @OneToMany등으로 설정된 변수에 (fetch = FetchType.LAZY) 로 설정하면 지연로딩으로 설정되어 부모객체(참조를 가지고 있는 객체)를 조회할 때 참조에 프록시 객체를 만들어 집어넣는다.

 

프록시 객체는 실제객체를 상속받아 만들어지고,  실제 데이터를 조회하려고 할때 데이터베이스를 조회한다.

 

 

즉시로딩의 문제점

- 예상하지 못한 SQL 발생

연관관계가  복잡해지면, 예상할 수 없는 조인이 수없이 연결되어 심각한 성능 저하를 발생시킬 수 있다.

 

- N + 1 문제

jpql을 통해 조회를 할 경우, SQL문으로 변환되어 실행된다. SQL문 실행 후 즉시로딩되어있는 객체에는 꼭 데이터를 채워줘야하므로 추가적인 SQL을 발생시킨다.

 

기본적으로 지연로딩을 사용하고, 즉시로딩이 필요할 경우 JPQL fetch 조인이나, 엔티티그래프 어노테이션을 활용해야 한다고 한다. 이 부분은 나중에 다시 공부할 것이다.

 

어쨌든 기본적으로 지연로딩을 무조건 사용할 것!!!!

 

 

XXXToOne 은 기본 즉시로딩, XXXToMany 는 기본 지연로딩으로 세팅되어있다/

 

영속성 전의 CASCADE

- cascade 옵션을 통해 특정 엔티티를 영속화할 때 연관관계에 있는 엔티티도 동시에 영속화 할 수 있다.

- 연관관계를 매핑하는것과 관계없다.

- 연관관계에서 연관된 엔티티가 하나일 때(단일 소유자일 때), 라이프사이클이 동일할때만 사용해야 한다.

 

고아 객체

- orphanRemoval = true 를 통해 사용할 수 있다.

- 고아 객체로 설정된 엔티티는 참조가 제거됐을 때 삭제한다.

- @OneToXXX 에서만 사용

- 참조하는 곳이 하나일 때만 사용

- 특정 엔티티가 단일 소유일 때만 사용한다. (다른 여러 곳에서 참조하고 있으면 안된다!!)

 

CascadeType.ALL, orphanRemovel=true  두 옵션을 모두 사용하면 엔티티의 생명주기 자체를 부모 엔티티를 통해서 관리할 수 있다. 이부분이 DDD의 어떤 개념을 구현할 때 유용하다고 한다. 조금 위험해 보이기도하고 아직 DDD에 대해 잘모르기 때문에 일단은 기억만 하고 가야겠다. 

 

참고

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard


프로그래머스 level 2 - 소수 찾기

https://programmers.co.kr/learn/courses/30/lessons/42839

 

코딩테스트 연습 - 소수 찾기

한자리 숫자가 적힌 종이 조각이 흩어져있습니다. 흩어진 종이 조각을 붙여 소수를 몇 개 만들 수 있는지 알아내려 합니다. 각 종이 조각에 적힌 숫자가 적힌 문자열 numbers가 주어졌을 때, 종이

programmers.co.kr

순열을 활용해야하는 문제였다. 제대로 이해하고 풀고싶어서 코드를 배끼지 않고 한줄한줄 풀었더니 시간이 더 오래 걸리고 코드가 깔끔하지 않은 느낌이다.  내일도 순열문제를 찾아 한번 다시 풀어봐서 체화시키도록 해야겠다.

 

풀이코드

https://github.com/unannn/CodingTestPractice/blob/main/programmers/level2/%EC%86%8C%EC%88%98%20%EC%B0%BE%EA%B8%B0.java

 

GitHub - unannn/CodingTestPractice: 코딩테스트 연습 문제 풀이 Repo 입니다.

코딩테스트 연습 문제 풀이 Repo 입니다. Contribute to unannn/CodingTestPractice development by creating an account on GitHub.

github.com