인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

인프런 커뮤니티 질문&답변

skehdxhd님의 프로필 이미지
skehdxhd

작성한 질문수

실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화

주문 조회 V1: 엔티티 직접 노출

Repository 질문입니다.

작성

·

254

0

안녕하세요 강사님. 강의 잘 듣고 있습니다.

궁금한점이 생겨 질문 드립니다.

회원 조회할때는 MemberService를 이용하여 회원을 조회하셨는데, 주문조회할때는 OrderRepository를 이용하여 조회하신 이유가 무엇인지 궁금합니다.

DB에 접근하는것은 Repository에,

접근한 데이터를 이용하여 비즈니스 로직을 짜는것은 Service에 둔다고 알고있는데 

왜 member쪽 controller에서는 Service를 이용하셨고, Order쪽 Controller에서는 Repository를 이용하셨는지 모르겠습니다.

2. api/v1/simple-orders에서

order.getMember().getName()에서도 질문이 있는데,

order.getMember()까지는 지연로딩으로 인해서 Member의 프록시 객체가 넘어오고,

order.getMember().getName()에서는 프록시 객체가 아직 실제 엔티티를 가리키지 않는(아직 데이터가 없는 상태)상황에서 Member의 내부 함수를 호출함으로 인해 프록시가 초기화된다고 이해했습니다.

그럼 여기서 초기화하기 위해서 getName이든, 아니면 꼭 getName이 아니어도 프록시는 초기화 된다고 봐도 되는게 맞는것인지 궁금하고,

 order.getMember.getName()에서 getName()은 프록시객체를 초기화할 목적이었으므로 api/v1/simple-orders를 포스트맨으로 get요청을 보냇을때, Member의 전체 데이터가 나오는게 맞는건지 궁금합니다.

order.getMember().getName()이 프록시를 초기화할 목적이었더라도 get요청에서는 member의 name데이터만 나올줄 알았는데(getName), address데이터까지 모조리 다 나오니 조금 의문이 들었습니다.

감사합니다.

답변 2

1

답변 전에 수정하셨군요 ㅎㅎ;

첫 질문 보고 해당 질문 내용만 신경쓰다보니 못봤었나봐요.

일부러 무시하진 않았습니다..ㅎㅎㅎ;

api/v1/simple-orders에서

order.getMember().getName()에서도 질문이 있는데,

order.getMember()까지는 지연로딩으로 인해서 Member의 프록시 객체가 넘어오고,

order.getMember().getName()에서는 프록시 객체가 아직 실제 엔티티를 가리키지 않는(아직 데이터가 없는 상태)상황에서 Member의 내부 함수를 호출함으로 인해 프록시가 초기화된다고 이해했습니다.

그럼 여기서 초기화하기 위해서 getName이든, 아니면 꼭 getName이 아니어도 프록시는 초기화 된다고 봐도 되는게 맞는것인지 궁금하고,

맞습니다. getName 뿐 아니라 다른 필드가 있다면 "해당 필드를 사용하는 시점(호출하는 시점)"에 다음과 같은 동작이 일어납니다.



 order.getMember.getName()에서 getName()은 프록시객체를 초기화할 목적이었으므로 api/v1/simple-orders를 포스트맨으로 get요청을 보냇을때, Member의 전체 데이터가 나오는게 맞는건지 궁금합니다.

order.getMember().getName()이 프록시를 초기화할 목적이었더라도 get요청에서는 member의 name데이터만 나올줄 알았는데(getName), address데이터까지 모조리 다 나오니 조금 의문이 들었습니다.

위의 이미지 3,4번을 볼까요? 실제 엔티티를  DB에서 조회 후 생성하기 때문에 직접 테스트 해본대로 결과가 도출되는게 맞습니다.

해당 내용에 대해선 JPA기본편 혹은 영한님의 JPA 책에서 프록시 관련 부분에서 자세히 설명해주시고 계십니다. 

감사합니다. 

0

안녕하세요. skehdxhd님, 공식 서포터즈 OMG입니다.

DB에 접근하는것은 Repository에,

접근한 데이터를 이용하여 비즈니스 로직을 짜는것은 Service에 둔다고 알고있는데 

알고 계신 내용이 틀린 내용은 아닙니다.

비교적 간단한 로직에 대해서는 컨트롤러에서 바로 Repository를 호출하여 사용하기도 합니다.

주문 같은 경우 위의 코드에서도 나와있지만 Repository에서 조회 조건을 이용하여 바로 값을 뽑아오는 단순한 로직인 반면,

회원 같은 경우 조회, 등록, 수정 등 다양한 로직을 설명하기 위해 Service에 비즈니스 로직을 구현하신 것으로 보입니다.

감사합니다.

skehdxhd님의 프로필 이미지
skehdxhd
질문자

넵 2번, 3번 질문도 답해주실수 있을까요?

제가 2번 내용에 대해 누락하고 답변 드린건지

제 답변 이후 질문을 추가하신건지 알 수 있을까요?

skehdxhd님의 프로필 이미지
skehdxhd
질문자

음 답변 전에 수정해서 2번질문도 추가했는데 안보이시는것 같아서 다시 쓸게요!

api/v1/simple-orders에서

order.getMember().getName()에서도 질문이 있는데,

order.getMember()까지는 지연로딩으로 인해서 Member의 프록시 객체가 넘어오고,

order.getMember().getName()에서는 프록시 객체가 아직 실제 엔티티를 가리키지 않는(아직 데이터가 없는 상태)상황에서 Member의 내부 함수를 호출함으로 인해 프록시가 초기화된다고 이해했습니다.

그럼 여기서 초기화하기 위해서 getName이든, 아니면 꼭 getName이 아니어도 프록시는 초기화 된다고 봐도 되는게 맞는것인지 궁금하고,

 order.getMember.getName()에서 getName()은 프록시객체를 초기화할 목적이었으므로 api/v1/simple-orders를 포스트맨으로 get요청을 보냇을때, Member의 전체 데이터가 나오는게 맞는건지 궁금합니다.

order.getMember().getName()이 프록시를 초기화할 목적이었더라도 get요청에서는 member의 name데이터만 나올줄 알았는데(getName), address데이터까지 모조리 다 나오니 조금 의문이 들었습니다.

이겁니다!!

skehdxhd님의 프로필 이미지
skehdxhd

작성한 질문수

질문하기