Search

45. 스프링부트 포토그램 프로필 페이지 양방향 매핑 이해하기

프로필 페이지

업로드한 이미지를 뷰 화면에 랜더링 해볼거다.
프로필화면으로 이동하게 하는 함수를 찾아서 이미지 데이터도 같이 넘겨줘야한다.
UserController.java
@GetMapping("/user/{id}") public String profile(@PathVariable int id) { return "user/profile"; }
Java
복사
@GetMapping("/user/{id}") public String profile(@PathVariable int id, Model model) { model.addAttribute("images", null) return "user/profile"; }
Java
복사
추가해주고 UserService.java에
public void 회원프로필() { }
Java
복사
CustomValidationException.java 를 참고해서
CustomException.java 를 생성
package com.cos.photogramstart.handler.ex; import java.util.Map; public class CustomException extends RuntimeException { private static final long serialVersionUID = 1L; private Map<String, String> errorMap; public CustomException(String message) { super(message); } }
Java
복사
해당 입셉션이 작동할려면 ControllerExceptionHandler.java 에
@ExceptionHandler(CustomValidationException.class) public String exception(CustomException e) { return Script.back(e.getMessage()); }
Java
복사
추가해준다.
UserService.java에 이어서 작성하면은
public void 회원프로필(int userId) { // SELECT * FROM image WHERE userId = :userId; User userEntity = userRepository.findById(userId).orElseThrow(()->{ throw new CustomException("해당 프로필 페이지는 없는 페이지입니다."); }); }
Java
복사
서비스에 추가해준 함수도 넣어주면
@RequiredArgsConstructor @Controller public class UserController { private final UserService userService; @GetMapping("/user/{id}") public String profile(@PathVariable int id, Model model) { userService.회원프로필(id); model.addAttribute("images", null); return "user/profile"; }
Java
복사
http://localhost:8080/user/2
2의 프로필 페이지로 가면 이렇게 에러알럿이 뜬다.(현재 ssar만 가입한 상태)
회원프로필함수에 userEntity리턴해줄거다.
public User 회원프로필(int userId) { // SELECT * FROM image WHERE userId = :userId; User userEntity = userRepository.findById(userId).orElseThrow(()->{ throw new CustomException("해당 프로필 페이지는 없는 페이지입니다."); }); return userEntity; }
Java
복사
그래서 UserController에서 받아서 처리해줄거다.
@GetMapping("/user/{id}") public String profile(@PathVariable int id, Model model) { User userEntity = userService.회원프로필(id); model.addAttribute("user", userEntity); return "user/profile"; }
Java
복사
프로필 페이지를 보면은
등록한 사진 및 내가 등록한 게시글 수, 구독정보, 자기소개 등등 여러가지 데이터를 가지고 와야한다.
근데 방금 userEntity를 넘겨주면서 유저정보를 넘겨주게 됐는데 거기에는 이미지정보가 없다.
그래서 1번유저에 대한 select가 이루어질때 DB의 영속성 컨텍스트에서 user를 영속화 시킬때 image도 포함해서 갖고올거다. → 이렇게 할려면 양방향 맵핑을 해야한다
User.java
private List<Image> images;
Java
복사
추가해준다.
근데 얘를 데이터베이스에 어떻게 만들지 싶어진다.
user테이블이 있으면 images컬럼에 List 면 컬렉션으로 들어가는 타입은 없다
그래서 이 부분은 데이터베이스에 만들지 말라고 해줘야한다.
//나는 연관관계의 주인이 아니다. 그러므로 테이블에 컬럼을 만들지마라~ //User를 SELECT 할때 해당 User id로 등록된 image를 다 갖고와 //LAZY 일때는 User를 SELECT 할때 해당 User id로 등록된 image들을 가져오지마 - 대신 getImages() 함수의 image들이 호츌될때 가져와 //Eager 일때는 User를 SELECT 할때 해당 User id로 등록된 image들을 Join해서 가져와 ! @OneToMany(mappedBy = "user", fetch = FetchType.LAZY) private List<Image> images; //양방향 맵핍
Java
복사
UserService.java에서 확인 콘솔을 찍어보면
public User 회원프로필(int userId) { // SELECT * FROM image WHERE userId = :userId; User userEntity = userRepository.findById(userId).orElseThrow(()->{ throw new CustomException("해당 프로필 페이지는 없는 페이지입니다."); }); System.out.println("==================================="); userEntity.getImages().get(0); return userEntity; }
Java
복사
Hibernate: select user0_.id as id1_2_0_, user0_.bio as bio2_2_0_, user0_.createDate as createda3_2_0_, user0_.email as email4_2_0_, user0_.gender as gender5_2_0_, user0_.name as name6_2_0_, user0_.password as password7_2_0_, user0_.phone as phone8_2_0_, user0_.profileImageUrl as profilei9_2_0_, user0_.role as role10_2_0_, user0_.username as usernam11_2_0_, user0_.website as website12_2_0_ from User user0_ where user0_.id=? =================================== Hibernate: select images0_.userId as userid5_0_0_, images0_.id as id1_0_0_, images0_.id as id1_0_1_, images0_.caption as caption2_0_1_, images0_.createDate as createda3_0_1_, images0_.postImageUrl as postimag4_0_1_, images0_.userId as userid5_0_1_ from Image images0_ where images0_.userId=?
Java
복사
user에 대한 데이터를 가지고 오고 userEntity.getImages().get(0); 하는 순간
이미지 관련 데이터를 가지고 온다.

*참고