์คํ๋ง์์ JPA๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด ์คํ๋ง ์ปจํ ์ด๋๊ฐ ํธ๋์ญ์ ๊ณผ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ๊ด๋ฆฌํด์ฃผ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฝ๊ฒ ๊ฐ๋ฐํ ์ ์์ต๋๋ค.
๋น์ฐํ๊ฒ๋ ์ด๋ฌํ JPA์ ๋ด๋ถ ๋์์๋ฆฌ๋ฅผ ๋ชจ๋ฅด๊ณ ์ฌ์ฉํ๋ค๋ฉด ์ฌ๋ฌ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ํด๊ฒฐํ๊ธฐ ์ด๋ ต์ต๋๋ค.
์ด๋ฒ ๊ธ์ ํตํด JPA๊ฐ ๋์ํ๋ ๋ด๋ถ ๋ฐฉ์์ ์ดํดํ๊ณ , ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ ๋ ๋ฐ์ํ ์ ์๋ ๋ค์ํ ๋ฌธ์ ์ ๊ณผ ํด๊ฒฐ ๋ฐฉ์์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
ํธ๋์ญ์ ๋ฒ์์ ์์์ฑ ์ปจํ ์คํธ
์คํ๋ง ์ปจํ ์ด๋์ ๊ธฐ๋ณธ ์ ๋ต์ 'ํธ๋์ญ์ ๋ฒ์์ ์์์ฑ ์ปจํ ์คํธ' ์ ๋๋ค.
์คํ๋ง์์ JPA๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด, ์คํ๋ง ์ปจํ ์ด๋๊ฐ ์ ๊ณตํ๋ ์ ๋ต์ ๋ฐ๋ผ์ผ ํฉ๋๋ค.
์คํ๋ง ์ปจํ ์ด๋๋ JPA์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ง์ํ ๋, ๊ธฐ๋ณธ ์ ๋ต์ผ๋ก ํธ๋์ญ์ ๋ฒ์์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํธ๋์ญ์ ์ ๋ฒ์์ ์์์ฑ ์ปจํ ์คํธ์ ์์กด ๋ฒ์๋ฅผ ๋ง์ถ๋ ์ ๋ต์ผ๋ก,
ํธ๋์ญ์ ์ด ์์ํ๋ ์๊ฐ ์์์ฑ ์ปจํ ์คํธ๋ ์์ฑ๋๊ณ ํธ๋์ญ์ ์ด ๋๋๋ ์๊ฐ์ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค.
๋ณดํต ์ฐ๋ฆฌ๋ ๋น์ฆ๋์ค ๋ก์ง์ ์์ํ๋ Business Layer(ํน์ Service Layer)์ @Transaction ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ํธ๋์ญ์ ์ ์์ํฉ๋๋ค.
@Transaction ์ด๋ ธํ ์ด์ ์ด ์์ผ๋ฉด ํธ์ถํ ๋ฉ์๋๋ฅผ ์คํํ๊ธฐ ์ง์ ์ ์คํ๋ง์ ํธ๋์ญ์ AOP๊ฐ ๋จผ์ ๋์ํฉ๋๋ค.
์ฝ๋๋ฅผ ํตํด ์ดํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
@Transactional
public class MemberService {
//CODE
public Member join(Member member){
//member๋ฅผ persistํ๋ ์ฝ๋ & ์ด๋ฐ์ ๋ฐ ์ฒ๋ฆฌ ๋ก์ง
return member;
}
}
@Controller
public class MemberController {
//CODE
@PostMapping("/~~")
public void signUp(@RequestBody MemberDto memberDto){
Member member = memberService.join(memberDto.toEntity); //ํธ์ถ ์ AOP๊ฐ ๋จผ์ ์๋ํ์ฌ ํธ๋์ญ์
์์
}
}
์ ์ฝ๋์์ signUp()์ ํธ์ถํ๋ ๊ฒฝ์ฐ, join()์ ํธ์ถํ๊ธฐ ์ ์ ์คํ๋ง์ ํธ๋์ญ์ AOP๊ฐ ๋จผ์ ์๋ํ์ฌ ํธ๋์ญ์ ์ ์์ํฉ๋๋ค.
ํธ๋์ญ์ ์ ๋์ ๋ฉ์๋(join())๊ฐ ์ ์ ์ข ๋ฃ๋๋ฉด ํธ๋์ญ์ ์ ์ปค๋ฐํ๋ฉด์ ์ข ๋ฃํฉ๋๋ค.
ํธ๋์ญ์ ์ ์ปค๋ฐํ๊ฒ ๋๋ฉด JPA๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ํ๋ฌ์ํด์ ๋ณ๊ฒฝ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํ ํ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค ํธ๋์ญ์ ์ ์ปค๋ฐํฉ๋๋ค.
๋ง์ฝ ์์ธ๊ฐ ๋ฐ์ํ๋ค๋ฉด ํธ๋์ญ์ ์ ๋กค๋ฐฑํ๊ณ ์ข ๋ฃํ๋๋ฐ ์ด ๊ฒฝ์ฐ์๋ ํ๋ฌ์๋ฅผ ํธ์ถํ์ง ์์ต๋๋ค.
(์ฒดํฌ๋ ์์ธ์ ์ธ์ฒดํฌ๋ ์์ธ์ ๋ฐ๋ผ ๋ค๋ฅด์ง๋ง, ๋์ด๊ฐ๋๋ก ํ๊ฒ ์ต๋๋ค.)
signUp()์์ join()์ ํธ์ถํ ๋ค member๋ฅผ ๋ฐํ๋ฐ์์ต๋๋ค.
ํ์ฌ ์ด member๋ ์์์ฑ ์ปจํ ์คํธ๊ฐ ๋๋ฌ๊ธฐ ๋๋ฌธ์ ์ค์์ ์ํ์ ๋๋ค.
์ด๋ฅผ ์ธ์งํ๊ณ ๋ค์์ผ๋ก ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
๊ฐ์ ํธ๋์ญ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
ํธ๋์ญ์ ์ด ๊ฐ์ผ๋ฉด, ๊ฐ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํธ๋์ญ์ ๋ฒ์์ ์์์ฑ ์ปจํ ์คํธ ์ ๋ต์ ๋ค์ํ ์์น์์ ์ํฐํฐ ๋งค๋์ ๋ฅผ ์ฃผ์ ๋ฐ์ ์ฌ์ฉํ๋๋ผ๋,
๋์ผํ ํธ๋์ญ์ ๋ด์์๋ ํญ์ ๊ฐ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ๊ฒ๋ ๊ตฌํ๋์ด ์์ต๋๋ค.
์์๋ฅผ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
@Repository
class Repo1 {
@PersistenceContext EntityManager em;
public void logic1(){
em.xxx(); // Repo1์ ์์์ฑ ์ปจํ
์คํธ ์ ๊ทผ
}
}
@Repository
class Repo2 {
@PersistenceContext EntityManager em;
public void logic2(){
em.xxx(); // Repo2์ ์์์ฑ ์ปจํ
์คํธ ์ ๊ทผ
}
}
์์ ๊ฐ์ ์ํฉ์์ ์๋ ์ฝ๋์ logic()์ ์คํํ๋ ์ํฉ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
@Service
class MainService{
@Autowired Repo1 repo1;
@Autowired Repo2 repo2;
@Transctional
public void logic(){
repo1.logic1();
repo2.logic2();
}
}
repo1๊ณผ repo2์ ์ํฐํฐ ๋งค๋์ ๋ ๋ค๋ฅด์ง๋ง, ๊ฐ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
๋์ผํ ํธ๋์ญ์ ์์๋ ํญ์ ๊ฐ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํด๋น ์์์ฑ ์ปจํ ์คํธ๋ ํธ๋์ญ์ ๊ณผ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋์ผํฉ๋๋ค.
๋ค๋ฅธ ํธ๋์ญ์ ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ
ํธ๋์ญ์ ์ด ๋ค๋ฅด๋ฉด, ๋ค๋ฅธ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํธ๋์ญ์ ๋ฒ์์ ์์์ฑ ์ปจํ ์คํธ ์ ๋ต ์ ๋ฆฌ
๋์ผํ ํธ๋์ญ์ ์ด๋ผ๋ฉด ๋์ผํ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
ํธ๋์ญ์ ๊ณผ ์์์ฑ ์ปจํ ์คํธ์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋์ผํฉ๋๋ค.
์ค์์ ์ํ์ ์ง์ฐ ๋ก๋ฉ
์คํ๋ง ์ปจํ ์ด๋์ ๊ธฐ๋ณธ ์ ๋ต์ ํธ๋์ญ์ ๋ฒ์์ ์์์ฑ ์ปจํ ์คํธ ์ ๋ต์ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ํธ๋์ญ์ ์ ๋ณดํต ์๋น์ค ๊ณ์ธต์์ ์์ํ๋ฏ๋ก ์๋น์ค ๊ณ์ธต์ด ์์๋๋ ์๊ฐ ํธ๋์ญ์ ์ด ์์ฑ๋๊ณ ,
์๋น์ค ๊ณ์ธต์ด ๋๋๋ ์์ ์ ํธ๋์ญ์ ์ด ์ข ๋ฃ๋๋ฉด์ ์์์ฑ ์ปจํ ์คํธ๋ ํจ๊ป ์ข ๋ฃ๋ฉ๋๋ค.
์๋น์ค ๊ณ์ธต์์ ์กฐํํ ์ํฐํฐ๋ ์๋น์ค์ ๋ฆฌํฌ์งํ ๋ฆฌ ๊ณ์ธต์์๋ ์์์ฑ ์ปจํ ์คํธ์ ๊ด๋ฆฌ๋์ง๋ง,
์ปจํธ๋กค๋ฌ๋ ๋ทฐ ๊ฐ์ ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต์์๋ ์ค์์ ์ํ(์์์ฑ ์ปจํ ์คํธ์ ๊ด๋ฆฌ๋์ง ์๋)๊ฐ ๋ฉ๋๋ค.
์์์ member๋ฅผ ๋ฐํํ๋ ์์๋ก ๋์๊ฐ ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
MemberController์ ๋ฐํ๋ member๋ ํ์ฌ ์ค์์ ์ํ์ ๋๋ค.
ํธ๋์ญ์ ๋ฒ์์ ์์์ฑ ์ปจํ ์คํธ ์ ๋ต์์๋ ํธ๋์ญ์ ์ด ๋๋๋ฉด ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ข ๋ฃ๋ฉ๋๋ค.
๋ฐ๋ผ์ ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต์์๋ ํธ๋์ญ์ ์ด ์ข ๋ฃ๋์๊ธฐ ๋๋ฌธ์ member๋ ์ค์์ ์ํ์ธ ๊ฒ์ ๋๋ค.
์ค์์ ์ํ๋ ์์ ์ํ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ์์์ฑ ์ปจํ ์คํธ์์ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ์ฌ์ฉํ์ง ๋ชปํฉ๋๋ค.
๋น์ฐํ๊ฒ๋ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ ๊ณตํ๋ ์ง์ฐ๋ก๋ฉ ๊ธฐ๋ฅ๋ ์ฌ์ฉํ์ง ๋ชปํฉ๋๋ค.
์๋๋ ์๊น ์ signUp() ์์์์ ์ฐ๊ด๋ Team์ name์ ์กฐํํ๋ ์ฝ๋๋ฅผ ์์ฑํ ๊ฒ์ ๋๋ค.
@Controller
public class MemberController {
//CODE
@PostMapping("/~~")
public void signUp(@RequestBody MemberDto memberDto){
Member member = memberService.join(memberDto.toEntity);
//ํ์ฌ member๋ ์ค์์ ์ํ
Team team = memger.getTeam();
team.getName(); //์ง์ฐ ๋ก๋ฉ ์ ์์ธ ๋ฐ์
}
}
member๋ ์ค์์ ์ํ์ด๊ธฐ ๋๋ฌธ์ ์ง์ฐ ๋ก๋ฉ์ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ค์์ ์ํ์ ์ง์ฐ ๋ก๋ฉ
์ค์์ ์ํ์ ๊ฐ์ฅ ๊ณจ์น ์ํ ๋ฌธ์ ์ ์ ์ง์ฐ ๋ก๋ฉ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์๋ฅผ ๋ค์ด ๋ทฐ๋ฅผ ๋ ๋๋งํ๋ ๊ฒฝ์ฐ, ์กฐํํ ์ํฐํฐ์ ์ฐ๊ด๋ ์ํฐํฐ๋ ํจ๊ป ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ์ง์ฐ ๋ก๋ฉ์ผ๋ก ์ค์ ํ์ฌ ํ๋ก์ ๊ฐ์ฒด๋ฅผ ์กฐํํ๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
(์์ ์์์์๋ Team์ ์ง์ฐ ๋ก๋ฉ์ผ๋ก ์ค์ ํ์๊ณ , Team ๊ฐ์ฒด๋ฅผ ํ๋ก์ ๊ฐ์ฒด๋ก ์กฐํํ ์ํฉ์ ๋๋ค.)
ํ๋ก์ ๊ฐ์ฒด๋ ์ด๊ธฐํ๋์ง ์์ ์ํ๋ก ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต์ ๋ฐํ๋ ์ํ์ ๋๋ค.
์ดํ ์ค์ ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์ค๋ ค๊ณ ์ด๊ธฐํ๋ฅผ ์๋ํ ๊ฒฝ์ฐ ์ค์์ ์ํ์ด๊ธฐ ๋๋ฌธ์ ์ง์ฐ ๋ก๋ฉ์ด ์๋ํ์ง ์์ ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ด์ ์ด๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
์ค์์ ์ํ์ ์ง์ฐ ๋ก๋ฉ ํด๊ฒฐ๋ฐฉ๋ฒ
- ๋ทฐ์์ ํ์ํ ์ํฐํฐ๋ฅผ ์๋น์ค ๊ณ์ธต์์ ๋ฏธ๋ฆฌ ๋ก๋ฉํด๋๋ ๋ฐฉ๋ฒ
- OSIV๋ฅผ ์ฌ์ฉํด์ ์ํฐํฐ๋ฅผ ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต๊น์ง ์์ ์ํ๋ก ์ ์งํ๋ ๋ฐฉ๋ฒ
๋ทฐ๊ฐ ํ์ํ ์ํฐํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ฉํด๋๋ ๋ฐฉ๋ฒ
- JPQL ํ์น ์กฐ์ธ ์ฌ์ฉ
- ๊ฐ์ ๋ก ์ด๊ธฐํ
- FACADE ๊ณ์ธต ์ถ๊ฐ
JPQL ํ์น ์กฐ์ธ ์ฌ์ฉ
ํ์น ์กฐ์ธ์ ๋น์ฐํ๊ฒ ์ ๊ฒ์ด๋ผ ์๊ฐํ๊ณ ๋์ด๊ฐ๊ฒ ์ต๋๋ค.
๋ชจ๋ฅธ๋ค๋ฉด ์ ์ ๋ค๋ฅธ ๊ธ ๋ค, ํน์ ๋ค๋ฅธ ์๋ฃ๋ค์ ์ฐธ๊ณ ํ์ฌ ๊ณต๋ถํ๋ ๊ฒ์ ์ถ์ฒํฉ๋๋ค.
ํ์น ์กฐ์ธ์ ๋จ์ ์ ํ๋ฉด์ ๋ง์ถ ๋ฆฌํฌ์งํ ๋ฆฌ ๋ฉ์๋๊ฐ ์ฆ๊ฐํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค.
์ด๋ ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต์ด ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต์ ์นจ๋ฒํด๋ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํฉ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๋ ๊ฐ๋จํ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
ํ๋ฉด A๋ฅผ ์ํ Member๋ง ์กฐํํ๋ memberRepo.findMember() ๋ฉ์๋
ํ๋ฉด B๋ฅผ ์ํ Member์ Team์ ๊ฐ์ด ์กฐํํ๋ memberRepo.findMemberWithTeam() ๋ฉ์๋
์ ์ํฉ์ ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต์ด ๋ ผ๋ฆฌ์ ์ผ๋ก memberRepo๋ฅผ ์นจ๋ฒํ๊ณ ์๋ ์ํฉ์ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด memberRepo.findMember() ๋ฉ์๋ ํ๋๋ง์ ์ฌ์ฉํ ํ, ํด๋น ๋ฉ์๋์์ fetch join์ ์ฌ์ฉํ์ฌ Team๊น์ง ํ๋ฒ์ ์กฐํํ๋ ๊ฒ์ ๋๋ค.
์ด๋ ๊ฒ ํ๋ฉด ๋ถ๋ช A์์๋ Team์ด ํ์ ์๊ธฐ ๋๋ฌธ์ ์ฝ๊ฐ์ ๋ก๋ฉ ์๊ฐ์ด ๋ ๊ธธ์ด์ง ์๋ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ ์ํฅ๋ ฅ์ ๋ฏธ๋นํ๋ฉฐ ๋ฌด๋ถ๋ณํ ๋ฐ์ดํฐ ์ต์ ํ๋ก ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต๊ณผ ๋ฐ์ดํฐ ์ ๊ทผ ๊ณ์ธต ๊ฐ์ ์์กด๊ด๊ณ๊ฐ ๊ธ๊ฒฉํ๊ฒ ์ฆ๊ฐํ๋ ๊ฒ๋ณด๋ค๋ ์ ์ ํ ์ ์์ ํํ์ ์ ์ฐพ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์ ๋๋ค.
๊ฐ์ ๋ก ์ด๊ธฐํ
๊ฐ์ ๋ก ์ด๊ธฐํ๋ ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ด์์์ ๋, ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต์ด ํ์ํ ์ํฐํฐ๋ฅผ ๊ฐ์ ๋ก ์ด๊ธฐํํ์ฌ ๋ฐํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์์ ์์์์๋ ์๋์ ๊ฐ์ด team ํ๋ก์๋ฅผ ๊ฐ์ ๋ก ์ด๊ธฐํ ํ ์ ์์ต๋๋ค.
public Member join(Member member){
//member๋ฅผ persistํ๋ ์ฝ๋ & ์ด๋ฐ์ ๋ฐ ์ฒ๋ฆฌ ๋ก์ง
member.getTeam().getName(); //๊ฐ์ ๋ก ์ด๊ธฐํ
return member;
}
๊ทธ๋ฌ๋ ์ด ์ญ์ ํ๋ ์ ํ ์ด์ ๊ณ์ธต์ด Service ๊ณ์ธต์ ์นจ๋ฒํด๋ฒ๋ฆฌ๋ ์ํฉ์ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ์ผ๋ก FACADE(ํผ์ฌ๋) ํจํด์ ๋์ ํ ์ ์์ต๋๋ค.
FACADE ๊ณ์ธต ์ถ๊ฐ
FACADE ๊ณ์ธต์ ๋ทฐ๋ฅผ ์ํ ํ๋ก์ ์ด๊ธฐํ๋ฅผ ๋ด๋นํ ๊ฒ์ ๋๋ค.
ํ๋ก์๋ฅผ ์ด๊ธฐํํ๋ ค๋ฉด ์์์ฑ ์ปจํ ์คํธ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์, ํธ๋์ญ์ ์ FACADE์์ ์์๋ฉ๋๋ค.
FACADE ๊ณ์ธต์ ๋ค์๊ณผ ๊ฐ์ ์ญํ ์ ์ํํฉ๋๋ค.
- ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต๊ณผ ๋๋ฉ์ธ ๋ชจ๋ธ ๊ณ์ธต ๊ฐ์ ๋ ผ๋ฆฌ์ ์์กด์ฑ์ ๋ถ๋ฆฌํฉ๋๋ค.
- ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต์์ ํ์ํ ํ๋ก์์ ๊ฐ์ฒด๋ฅผ ์ด๊ธฐํํด์ค๋๋ค.
- ์๋น์ค ๊ณ์ธต์ ํธ์ถํ์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์คํํฉ๋๋ค.
- ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ง์ ํธ์ถํด์ ๋ทฐ๊ฐ ์๊ตฌํ๋ ์ํฐํฐ๋ฅผ ์ฐพ์ ์๋ ์์ต๋๋ค.
FACADE๋ฅผ ๋์ ํ๋ ์์ ๋ฅผ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
class MemberFacade {
@Autowired MemberSerivce memberSerivce;
public Member signUp(Member member){
Member findMember = memberService.join(member);
findMember.getTeam().getName();
return findMember;
}
}
์ด์ ์ปจํธ๋กค๋ฌ์์ MemberService ๋์ MemberFacade์ signUp()์ ํธ์ถํด์ฃผ๋ฉด ๋ฉ๋๋ค.
FACADE ๊ณ์ธต์ ์ฌ์ฉํด์ ์๋น์ค ๊ณ์ธต๊ณผ ํ๋ ์ ํ ์ด์ ๊ณ์ธต์ ๋ ผ๋ฆฌ์ ์์กด์ฑ์ ๋ถ๋ฆฌํ์์ต๋๋ค.
์ด๋ ์ด๋ก ์ ์ผ๋ก๋ ๋งค์ฐ ํ๋ฅญํ๋ ์ค์ฉ์ ์ธ ๊ด์ ์ผ๋ก ๋ณผ ๋, ์ค๊ฐ์ ๊ณ์ธต์ด ํ๋ ๋ ์ถ๊ฐ๋๊ธฐ ๋๋ฌธ์ ๋ ๋ง์ ์ฝ๋๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
์ง๊ธ๊น์ง ๋ทฐ๊ฐ ํ์ํ ์ํฐํฐ๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ฉํด๋๋ ๋ฐฉ๋ฒ์ ๋ํด์ ์ดํด๋ณด์์ต๋๋ค.
์ ๋ฐฉ๋ฒ๋ค์ ์๋นํ ๋ฒ๊ฑฐ๋กญ๊ณ , ์ด๋ฐ์ ๋ฐ ๋ฌธ์ ์ ์ด ๋ง์ด ์๊ธธ ์ ์์ต๋๋ค.
์ด ๋ชจ๋ ๋ฌธ์ ์ ์์ธ์ ์ํฐํฐ๊ฐ ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต์์ ์ค์์ ์ํ์ด๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋๋ค.
์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ทฐ๊น์ง ์ด์์๊ฒ ๋ง๋ค์ด์ค ๋ฐฉ๋ฒ์ด ์๋ค๋ฉด ๋ทฐ์์๋ ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํ ์ ์์ ๊ฒ์ด๊ณ , ์์ ๋ฌธ์ ์ ๋ค์ ์ฝ๊ฒ ํด๊ฒฐํ ์ ์์ ๊ฒ์ ๋๋ค.
์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ทฐ๊น์ง ์ด์์๊ฒ ๋ง๋ค์ด์ค ๋ฐฉ๋ฒ. ๊ทธ๊ฒ์ด ๋ฐ๋ก OSIV์ ๋๋ค.
OSIV (Open Session In View)
์์์ฑ ์ปจํ ์คํธ๋ฅผ ๋ทฐ๊น์ง ์ด์ด๋๊ฒ ๋ค๋ ์๋ฏธ์ ๋๋ค.
์ฌ์ค์ OSIV๋ ํ์ด๋ฒ๋ค์ดํธ์์ ์ฌ์ฉํ๋ ์ฉ์ด์ ๋๋ค.
JPA์์๋ OEIV(Open EntityManager In View)๋ผ๊ณ ํ์ง๋ง, ๊ด๋ก์ ๋ค๋ค OSIV๋ก ๋ถ๋ฆ ๋๋ค.
์์์ฑ ์ปจํ ์คํธ๊ฐ ์ด์์์ผ๋ฉด, ์ํฐํฐ๋ ์์ ์ํ๋ก ๊ด๋ฆฌ๋๊ธฐ ๋๋ฌธ์ ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
OSIV๋ฅผ ๊ตฌํํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๊ธฐ ์ํด, ๊ณผ๊ฑฐ๋ถํฐ ํ์ฌ๊น์ง์ OSIV ๊ตฌํ์ ๋ฐ์ ๊ณผ์ ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
๊ณผ๊ฑฐ OSIV - ์์ฒญ ๋น ํธ๋์ญ์
OSIV์ ๊ฐ์ฅ ๋จ์ํ ๊ตฌํ ๋ฐฉ๋ฒ์ ํด๋ผ์ด์ธํธ ์์ฒญ์ด ๋ค์ด์ค์๋ง์ ์๋ธ๋ฆฟ ํํฐ ํน์ ์คํ๋ง ์ธํฐ์ ํฐ์์ ํธ๋์ญ์ ์ ์์ํ๊ณ ์์ฒญ์ด ๋๋ ๋ ํธ๋์ญ์ ๋ ๋๋ด๋ ๊ฒ์ ๋๋ค.
์ด๊ฒ์ ์์ฒญ ๋น ํธ๋์ญ์ ๋ฐฉ์์ OSIV๋ผ ๋ถ๋ฆ ๋๋ค. (Trascation per request)
๋ฌธ์ ์
์ ๋ฐฉ์์ ๋ฌธ์ ์ ์ ์ปจํธ๋กค๋ฌ๋ ๋ทฐ ๊ฐ์ ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต์ด ์ํฐํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค๋ ์ ์ ๋๋ค.
์์๋ฅผ ํ๋ ๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
๊ณ ๊ฐ์ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ๋ง๋ค์๊ณ , ํ๋ฉด์์๋ ๋ณด์์ ์ํด ๊ณ ๊ฐ์ ์ด๋ฆ์ "XXX"์ฒ๋ผ ๋ณ๊ฒฝํด์ ๋ณด์ฌ์ฃผ์ด์ผ ํ๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
์ปจํธ๋กค๋ฌ์์๋ member๋ฅผ ๊ฐ์ ธ์์ ๋ค์๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์์ฑํ ๊ฒ์ ๋๋ค.
Member member = memberService.getMember(id);
member.setName("XXX");
model.addAttribute("member", member);
์ ์ฝ๋์ ๊ฒฐ๊ณผ๋ก ์ด๋ ํ ํ์์ด ๋ฐ์ํ ๊น์?
๋น์ฐํ ํ๋ฉด์์๋ XXX๋ก ์ ๋ณด์ฌ์ง ๊ฒ์ ๋๋ค.
๊ทธ๋ฌ๋ OSIV ๋ฐฉ์์ ์ฌ์ฉํ์๊ธฐ์ member ์ํฐํฐ๋ ์์ ์ํ์ ๋๋ค.
๋ฐ๋ผ์ ๋ณ๊ฒฝ๊ฐ์ง ๊ธฐ๋ฅ์ด ์๋ํฉ๋๋ค.
์ฆ member์ ์ด๋ฆ์ด ์์ XXX๋ก ๋ฐ๋์ด์ DB์ ์ ์ฅ๋ฉ๋๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์๋ ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต์์๋ ์ํฐํฐ๋ฅผ ์์ ํ์ง ๋ชปํ๊ฒ ๋ง์ผ๋ฉด ๋๋๋ฐ, ๋ค์๊ณผ ๊ฐ์ ๋ฐฉ๋ฒ๋ค์ด ์์ต๋๋ค.
- ์ํฐํฐ๋ฅผ ์ฝ๊ธฐ ์ ์ฉ ์ธํฐํ์ด์ค๋ก ์ ๊ณต
- ์ํฐํฐ๋ฅผ ์ฝ๊ธฐ ์ ์ฉ ๋ฉ์๋๋ง ๊ฐ์ง Wrapper ํด๋์ค๋ก ๋งคํ
- DTO๋ง ๋ฐํ
์์ ๋ฐฉ๋ฒ๋ค์ ๋ชจ๋ ์ฝ๋๋์ด ์๋นํ ์ฆ๊ฐํ๋ค๋ ๋จ์ ๋ค์ด ์์ต๋๋ค.
์์ ๋ฌธ์ ๋ค์ ๋ชจ๋ ์์ฒญ ๋น ํธ๋์ญ์ ๋ฐฉ์์ ์ฌ์ฉํ๋ OSIV์์ ๋ฐ์ํ๋ ๋ฌธ์ ์ ๋ค์ด๊ณ , ๋ฐ๋ผ์ ์์ฆ์๋ ๊ฑฐ์ ์ฌ์ฉํ์ง ์์ต๋๋ค.
์ต๊ทผ์๋ ์ด๋ฌํ ๋ฌธ์ ์ ์ ์ด๋์ ๋ ๋ณด์ํด์ ๋น์ฆ๋์ค ๊ณ์ธต์์๋ง ํธ๋์ญ์ ์ ์ ์งํ๋ ๋ฐฉ์์ OSIV๋ฅผ ์ฌ์ฉํ๋๋ฐ,
์ด๊ฒ์ด ๋ฐ๋ก ์คํ๋ง ํ๋ ์์ํฌ๊ฐ ์ ๊ณตํ๋ OSIV์ ๋๋ค.
์คํ๋ง์ด ์ ๊ณตํ๋ OSIV - ๋น์ฆ๋์ค ๊ณ์ธต ํธ๋์ญ์
์คํ๋ง์ ๋ค์ํ OSIV๋ฅผ ์ ๊ณตํ๋๋ฐ, ์ด๋ค ์ค ์ํ๋ ํด๋์ค๋ฅผ ์ ํํด์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ํ์ด๋ฒ๋ค์ดํธ OSIV ์๋ธ๋ฆฟ ํํฐ : org.springframework.orm.hibernate5.support.OpenSessionInViewFilter
- ํ์ด๋ฒ๋ค์ดํธ OSIV ์คํ๋ง ์ธํฐ์ ํฐ: org.springframework.orm.hibernate5.support.OpenSessionInViewInterceptor
- JPA OEIV ์๋ธ๋ฆฟ ํํฐ : org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter
- JPA OEIV ์คํ๋ง ์ธํฐ์ ํฐ : org.springframework.orm.jpa.support.OpenEntityManagerInViewInterceptor
์ด์ ์ ์ดํด๋ณด์๋ ์์ฒญ ๋น ํธ๋์ญ์ ๋ฐฉ์์ OSIV๋ ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต์์ ๋ฐ์ดํฐ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค๋ ๋ฌธ์ ์ ์ด ์์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ์คํ๋ง ํ๋ ์์ํฌ์ OSIV๋ ์ด๋ฐ ๋ฌธ์ ์ ๋ค์ ์ด๋์ ๋ ํด๊ฒฐํ์์ต๋๋ค.
์คํ๋ง ํ๋ ์์ํฌ๊ฐ ์ ๊ณตํ๋ OSIV๋ ๋น์ฆ๋์ค ๊ณ์ธต์์ ํธ๋์ญ์ ์ ์ฌ์ฉํ๋ OSIV ์ ๋๋ค
์ฆ OSIV๋ฅผ ์ฌ์ฉํ๊ธฐ๋ ํ์ง๋ง ํธ๋์ญ์ ์ ๋น์ฆ๋์ค ๊ณ์ธต์์๋ง ์ฌ์ฉํ๋ค๋ ๋ป์ ๋๋ค.
๋์ ์๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ํด๋ผ์ด์ธํธ ์์ฒญ์ด ๋ค์ด์ค๋ฉด ์๋ธ๋ฆฟ ํํฐ ํน์ ์คํ๋ง ์ธํฐ์ ํฐ์์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค. ๋จ ์ด๋ ํธ๋์ญ์ ์ ์์ํ์ง ์์ต๋๋ค.
- ์๋น์ค ๊ณ์ธต์์ @Transactional๋ก ํธ๋์ญ์ ์ ์์ํ ๋ 1๋ฒ์์ ๋ฏธ๋ฆฌ ์์ฑํด๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฐพ์์์ ํธ๋์ญ์ ์ ์์ํฉ๋๋ค.
- ์๋น์ค ๊ณ์ธต์ด ๋๋๋ฉด ํธ๋์ญ์ ์ ์ปค๋ฐํ๊ณ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ํ๋ฌ์ํฉ๋๋ค. ์ด๋ ํธ๋์ญ์ ์ ๋๋ด์ง๋ง ์์์ฑ ์ปจํ ์คํธ๋ ์ข ๋ฃํ์ง ์์ต๋๋ค.
- ์ปจํธ๋กค๋ฌ์ ๋ทฐ๊น์ง ์์์ฑ ์ปจํ ์คํธ๊ฐ ์ ์ง๋๋ฏ๋ก ์กฐํํ ์ํฐํฐ๋ ์์ ์ํ๋ฅผ ์ ์งํฉ๋๋ค.
- ์๋ธ๋ฆฟ ํํฐ๋ ์คํ๋ง ์ธํฐ์ ํฐ๋ก ์์ฒญ์ด ๋์์ค๋ฉด ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ข ๋ฃํฉ๋๋ค. ๋จ ์ด๋ ํ๋ฌ์๋ฅผ ํธ์ถํ์ง ์๊ณ ๋ฐ๋ก ์ข ๋ฃํฉ๋๋ค.
๋ฐ๋ผ์ ์์์ฑ ์ปจํ ์คํธ๋ ํ๋ ์ ํ ์ด์ ๊ณ์ธต๊น์ง ์ด๋ ค๋๋ฉด์, ๋ณ๊ฒฝ์ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ ๊ฒ์ ๋๋ค.
ํธ๋์ญ์ ์์ด ์ฝ๊ธฐ
์์์ฑ ์ปจํ ์คํธ๋ฅผ ํตํ ๋ชจ๋ ๋ณ๊ฒฝ์ ํธ๋์ญ์ ์์์ ์ด๋ฃจ์ด์ ธ์ผ ํฉ๋๋ค.
๊ทธ๋ฌ๋ ๋ณ๊ฒฝ์ด ์๋ ๋จ์ ์กฐํ์ ๊ฒฝ์ฐ์๋ ํธ๋์ญ์ ์ด ์์ด๋ ๊ฐ๋ฅํฉ๋๋ค.
์ด๊ฒ์ ํธ๋์ญ์ ์์ด ์ฝ๊ธฐ(Nontransaction reads)๋ผ ๋ถ๋ฆ ๋๋ค.
ํ๋ก์๋ฅผ ์ด๊ธฐํํ๋ ์ง์ฐ ๋ก๋ฉ๋ ๊ฒฐ๊ตญ์ ์กฐํ ๊ธฐ๋ฅ์ด๋ฏ๋ก ํธ๋์ญ์ ์์ด ์ฝ๊ธฐ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
์คํ๋ง OSIV ์ฃผ์์ฌํญ
์คํ๋ง OSIV๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต์์ ์ํฐํฐ๋ฅผ ์์ ํด๋ ์์ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํ์ง ์๋๋ค๊ณ ํ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ํ ๊ฐ์ง ์์ธ ์ฌํญ์ด ์์ต๋๋ค.
ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต์์ ์ํฐํฐ๋ฅผ ์์ ํ ์งํ์ ํธ๋์ญ์ ์ ์์ํ๋ ์๋น์ค ๊ณ์ธต์ ํธ์ถํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ฝ๋๋ฅผ ํตํด ์์๋ณด๊ฒ ์ต๋๋ค.
@Controller
class MemberController {
public String view(Long id){
Member member = memberService.getMember(id);
member.setName("XXX");
memberService.logic();// ํธ๋์ญ์
์ ์์ํ๋ ๋ก์ง
return "view"
}
}
- memberService์ getMember๋ฅผ ํตํด ์ฐพ์์จ Member๋ฅผ ์์์ฑ ์ปจํ ์คํธ์ ์ ์ฅํฉ๋๋ค. (ํธ๋์ญ์ ์ ์์ํ์ง ์์์ง๋ง ์์์ฑ ์ปจํ ์คํธ๋ ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ๊ฐ๋ฅํฉ๋๋ค.)
- ์ฐพ์์จ member์ ์ด๋ฆ์ XXX๋ก ๋ฐ๊พธ์์ต๋๋ค.
- logic() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ํธ๋์ญ์ ์ด ์๋ ๋น์ฆ๋์ค ๋ก์ง์ ์คํํ์์ต๋๋ค.
- ํธ๋์ญ์ AOP๊ฐ ๋์ํ๋ฉด์ ์์์ฑ ์ปจํ ์คํธ์ ํธ๋์ญ์ ์ ์์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ logic() ๋ฉ์๋๋ฅผ ์คํํฉ๋๋ค.
- logic()๋ฉ์๋๊ฐ ๋๋๋ฉด ํธ๋์ญ์ AOP๋ ํธ๋์ญ์ ์ ์ปค๋ฐํ๊ณ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ํ๋ฌ์ํฉ๋๋ค. ์ด๋ ๋ณ๊ฒฝ ๊ฐ์ง๊ฐ ๋์ํ๋ฉด์ ํ์ ์ํฐํฐ์ ์์ ์ฌํญ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ฐ์ํฉ๋๋ค.
์ปจํธ๋กค๋ฌ์์ ์ํฐํฐ๋ฅผ ์์ ํ๊ณ ์ฆ์ ๋ทฐ๋ฅผ ํธ์ถํ ๊ฒ์ด ์๋๋ผ, ํธ๋์ญ์ ์ด ๋์ํ๋ ๋น์ฆ๋์ค ๋ก์ง์ ํธ์ถํ์ผ๋ฏ๋ก ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋จ์ํ ๋ฐฉ๋ฒ์ ํธ๋์ญ์ ์ด ์๋ ๋น์ฆ๋์ค ๋ก์ง์ ๋ชจ๋ ์ฒ๋ฆฌํ ํ ์ํฐํฐ๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ์ ๋๋ค.
ํธ๋์ญ์ ์ด ๊ฐ์ผ๋ฉด ํญ์ ๊ฐ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ์ฉํ๊ณ , ์์์ฑ ์ปจํ ์คํธ์ ํธ๋์ญ์ ์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๋์ผํ๋ค๊ณ ํ์์ต๋๋ค.
OSIV๋ฅผ ์ฌ์ฉํ์ง ์๋ ํธ๋์ญ์ ๋ฒ์์ ์์์ฑ ์ปจํ ์คํธ ์ ๋ต์ ํธ๋์ญ์ ์ ์๋ช ์ฃผ๊ธฐ์ ์์์ฑ ์ปจํ ์คํธ์ ์๋ช ์ฃผ๊ธฐ๊ฐ ๊ฐ์ผ๋ฏ๋ก ์ง๊ธ๊น์ง ์ดํด๋ณด์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์คํ๋ง OSIV๋ ๊ฐ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๊ณต์ ํ ์ ์์ผ๋ฏ๋ก ์ด๋ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
OSIV ์ ๋ฆฌ
์คํ๋ง OSIV์ ํน์ง
- ์คํ๋ง OSIV๋ ํด๋ผ์ด์ธํธ์ ์์ฒญ์ด ๋ค์ด์ฌ ๋ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์์ฑํด์ ์์ฒญ์ด ๋๋ ๋๊น์ง ๊ฐ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ ์งํฉ๋๋ค. ๋ฐ๋ผ์ ํ ๋ฒ ์กฐํํ ์ํฐํฐ๋ ์์ฒญ์ด ๋๋ ๋๊น์ง ์์ ์ํ๋ฅผ ์ ์งํฉ๋๋ค.
- ์ํฐํฐ ์์ ์ ํธ๋์ญ์ ์ด ์๋ ๊ณ์ธต์์๋ง ๋์ํฉ๋๋ค. ํธ๋์ญ์ ์ด ์๋ ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต์ ์ง์ฐ ๋ก๋ฉ์ ํฌํจํด์ ์กฐํ๋ง ํ ์ ์์ต๋๋ค.
์คํ๋ง OSIV์ ๋จ์
- OSIV๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ ์์์ฑ ์ปจํ ์คํธ๋ฅผ ์ฌ๋ฌ ํธ๋์ญ์ ์ด ๊ณต์ ํ ์ ์๋ค๋ ์ ์ ์ฃผ์ํด์ผ ํฉ๋๋ค. ํนํ ํธ๋์ญ์ ๋กค๋ฐฑ ์ ์ฃผ์ํด์ผ ํฉ๋๋ค.
- ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต์์ ์ํฐํฐ๋ฅผ ์์ ํ๊ณ ๋ ํ ๋น์ฆ๋์ค ๋ก์ง์ ์ํํ๋ฉด ์ํฐํฐ๊ฐ ์์ ๋ ์ ์์ต๋๋ค.
- ํ๋ฆฌ์ ํ ์ด์ ๊ณ์ธต์์ ์ง์ฐ ๋ก๋ฉ์ ์ํ SQL์ด ์คํ๋ฉ๋๋ค. ๋ฐ๋ผ์ ์ฑ๋ฅ ํ๋์์ ํ์ธํด์ผ ํ ๋ถ๋ถ์ด ๋์ด์ง๋๋ค.
- ๋๋ฌด ์ค๋์๊ฐ ๋์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ปค๋ฅ์ ๋ฆฌ์์ค๋ฅผ ์ฌ์ฉํฉ๋๋ค. ๋ฐ๋ผ์ ์ค์๊ฐ ํธ๋ํฝ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ปค๋ฅ์ ์ด ๋ชจ์๋ ์ ์์ผ๋ฉฐ, ์ด๊ฒ์ ๊ฒฐ๊ตญ ์ฅ์ ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
OSIV vs FACADE vs DTO
OSIV์ ์ ๋ฐ ๋ฌธ์ ์ ๋ค์ด ๋๋ ต๋ค๋ฉด FACADE๋ DTO๋ฅผ ๋ง๋ค์ด์ ๋ฐํํ๋ ๋ฐฉ๋ฒ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ค ๋ฐฉ๋ฒ์ด๋ OSIV์ ๋นํด์๋ ์ฝ๋๋ฅผ ๋ง์ด ์์ฑํด์ผ ํฉ๋๋ค.
OSIV๋ ๋ง๋ฅ์ด ์๋๋๋ค.
OSIV๋ ๋ณต์กํ ํ๋ฉด์ ๊ตฌ์ฑํ๋ ๊ฒฝ์ฐ ํจ๊ณผ์ ์ด์ง ์์ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด ๋ณต์กํ ํ๋ฉด์ ์ํฐํฐ๋ก ์กฐํํ๊ธฐ๋ณด๋ค๋ ์ฒ์๋ถํฐ DTO๋ก ์กฐํํ๋ ๊ฒ์ด ํจ๊ณผ์ ์ ๋๋ค.
OSIV๋ ๊ฐ์ JVM์ ๋ฒ์ด๋ ์๊ฒฉ ์ํฉ์์๋ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด JSON์ด๋ XML์ ์์ฑํ ๋๋ ์ง์ฐ ๋ก๋ฉ์ ์ฌ์ฉํ ์ ์์ผ๋, ์๊ฒฉ์ง์ธ ํด๋ผ์ด์ธํธ์์ ์ฐ๊ด๋ ์ํฐํฐ๋ฅผ ์ง์ฐ ๋ก๋ฉํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค.
๊ฒฐ๊ตญ ํด๋ผ์ด์ธํธ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ JSON์ผ๋ก ์์ฑํด์ ๋ฐํํด์ผ ํฉ๋๋ค.
๊ถ์ฅํ๋ ๋ฐฉ๋ฒ
- ์ค์๊ฐ ํธ๋ ํฝ์ด ์ค์ํ ๊ฒฝ์ฐ OSIV๋ฅผ ์ฌ์ฉํ์ง ๋ง๊ณ , DTO๋ก ์ง์ ์กฐํํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
- ์ด๋๋ฏผ ํ์ด์ง๊ฐ์ด ์ค์๊ฐ ํธ๋ ํฝ์ด ์ค์ํ์ง ์๋ ๊ฒฝ์ฐ OSIV๋ฅผ ์ฌ์ฉํด๋ ๊ด์ฐฎ์ต๋๋ค.
- Command์ Query๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
Command์ Query ๋ถ๋ฆฌ
๊น๊ฒ ๋ค์ด๊ฐ๋ฉด ๋ช ๋ น๋ชจ๋ธ๊ณผ ์กฐํ๋ชจ๋ธ์ ๋ฐ๋ก ๋๊ณ ๊ตฌํํ๊ฑฐ๋ ํ๋ ๋ฐฉ๋ฒ๊น์ง๋ ๊ฐ ์ ์์ง๋ง, ์ฌ๊ธฐ์๋ ๊ฐ๋จํ๊ฒ ๋ช ๋ น๊ณผ ์กฐํ๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋ํด์ ์ธ๊ธํ๊ณ ์ ํฉ๋๋ค.
๋ช ๋ น์ด๋ผ๋ฉด xxxService, ์กฐํ๋ผ๋ฉด xxxQueryService๋ฅผ ๋๊ณ , QueryService์์ DTO๋ฅผ Projection ํ๋ ๊ฒ์ด ํต์ฌ ๋น์ฆ๋์ค ๋ก์ง์ ์ํฅ์ ์ฃผ์ง ์์ผ๋ฉด์๋, ๋ฌธ์ ์์ด ํจ์จ์ ์ธ ์ฟผ๋ฆฌ๋ฅผ ์์ฑํ ์ ์๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ธ๊ฐ ์ ์๊ฒ ๋์์ค๋๋ค
Reference
'๐๏ธ Spring > JPA' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JPA] JPA๊ฐ ์ง์ํ๋ ์ปฌ๋ ์ (0) | 2021.12.21 |
---|---|
[JPA] @OrderBy - ๋ฆฌ์คํธ์ ์์ ์ง์ ํ๊ธฐ (0) | 2021.12.21 |
[JPA] JPA์ ์ฑ๋ฅ ์ต์ ํ (0) | 2021.12.19 |
[JPA] ๋ณํฉ(merge)์ ๋ํด (0) | 2021.12.18 |
[JPA] ์คํ๋ง๋ถํธ ์ฌ์ฉ ์ EntityManagerFactory๋ฅผ ์ฃผ์ ๋ฐ๋ ๋ฐฉ๋ฒ (@PersistenceUnit) (0) | 2021.12.18 |