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

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

KwangMin Lee님의 프로필 이미지
KwangMin Lee

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

컨트롤러에서 값을 리턴받는 또 다른 방법이 있을까요?

작성

·

310

0

안녕하세요 영한님.

최근 토이프로젝트를 만드는데 궁금한 점이 있어서 문의 올립니다..

저번 질문이랑 연관되어서 올리는 질문입니다.

먼저 코드를 보여드리자면...

//Domain

@Entity
@Getter @Setter
public class Member {

@Id @GeneratedValue
@Column(name = "member_id")
private Long id;
private String name;
private String gender;

@JsonIgnore
@OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL)
@JoinColumn(name = "locker_id")
private Locker locker;


}

@Entity
@Getter @Setter
public class Locker {

@Id @GeneratedValue
@Column(name = "locker_id")
private Long id;
private String locker_password;
}

//Repository

public List<Member> findAllByGender(String gender) {
Member member = new Member();
return em.createQuery("select m from member m where gender = :gender", Member.class)
.setParameter("gender", gender)
.getResultList();
}

//Controller

@PostMapping(value = "/test/findAllByGender")
@ResponseBody
public List<Member> findAllByGender(@RequestBody String gender){
List<Member> result = mapService.findAllByGender(gender);
return result;
}

* 각 Member 는 한개의 락커를 가지고 있는 상황(1:1)

* Member가 관계의 주인(단방향)

-------

위 상황에서 최종적으로 구할려고 하는 값은 Member의 gender를 조건으로 Locker의 locker_password를 얻고자 합니다.

위 컨트롤러에서 


String locker_password = result.get(0).getLocker().getLocker_password();

또는

타임리프로 html 상에서


<
td th:text="${member.locker[0].locker_password}"></td>

로 구할 수 있다고 생각합니다.

하지만 저는 javascript에서 ajax를 통해 js파일 상에서 값을 리턴받고 있습니다.

ajax를 통해 컨트롤러의 리턴 값인 List<Member>를 받아서 열어보니 조인 했던 Locker 부분만 쏙 빠진채 JSON형태로 된 member 객체만 얻을 수 있었습니다.

ex) [{ "id":1, "name": "KIM",  "gender":"male"}, { "id":2, "name": "LEE",  "gender":"female"}, ...... ]

타임리프를 사용 하듯이 List<Member>객체를 리턴 받으면서 Locker클래스의 값을 쉽게 얻을 수 없을까요??

제가 생각한 방법으로는 리턴을 List<Locker>로 변경하여 for문을 돌려 set으로 값을 넣어주는 방법만 떠오르는데 너무 비효율적인 것 같아서요...

긴 문의글 읽어주셔서 감사합니다.

※ 질문을 드리다보니 수업내용에서 조금 벗어난 것 같아 죄송합니다..;;;

답변 1

0

김영한님의 프로필 이미지
김영한
지식공유자

안녕하세요. KwangMin Lee님^^ 좋은 질문입니다.

최근에는 스프링과 JPA를 사용하면서 이렇게 API로 응답 결과를 반환하는 경우가 많은데요.

문제는 API를 사용하면 지연로딩을 사용하기 어렵습니다.

따라서 단순한 해결방안은 회원과 locker를 페치 조인으로 한번에 조회해야 합니다.

그러면 원하는 결과가 들어있을거에요.

그런데 결국 조금만 복잡해지면 다양한 해결방법이 필요한데요.

관련해서 궁금해하시는 내용이 바로 실전! 스프링 부트와 JPA 활용2 - API 개발과 성능 최적화 강의에 단계별로 자세하게 소개되어 있습니다.

감사합니다.

KwangMin Lee님의 프로필 이미지
KwangMin Lee

작성한 질문수

질문하기