-
로그인 세션으로 자동 CRUD프로젝트/Trend-Pick 2023. 7. 12. 02:24
CRUD를 해야 할 상황에 로그인 된 아이디가 member로 들어가서 글을 쓰거나 사진을 올리거나 로직을 작성해야 했다.
이전에는 임의의 member를 만든 다음에 테스트를 진행해봤는데, 실제 컨트롤러에서는 세션에서 받아와서 글쓰기를 하면 그 회원이 자동으로 post.member로 데이터가 들어가야 한다.
이전 스프링 MVC 포스팅에서 로그인하는 게시글이 있는데, 그 게시글을 참고해서 로그인 기능을 구현했다.
로그인 기능의 일부(자세한 코드는 깃허브에 있는 코드 참조)
@Service @Transactional(readOnly = true) @RequiredArgsConstructor public class LoginService { private final MemberRepository memberRepository; @Transactional public Member login(String loginId, String password) { return memberRepository.findByLoginId(loginId) .filter(m -> m.getPassword().equals(password)) .orElse(null); } }
@Override public void addInterceptors(InterceptorRegistry registry) { // 스프링이 제공하는 메서드를 인터셉터 해야함 registry.addInterceptor(new LoginInterceptor()) .order(1) .addPathPatterns("/**") .excludePathPatterns("/css/**", "/*.ico", "/error"); registry.addInterceptor(new LoginCheckInterceptor()) .order(2) .addPathPatterns("/**") .excludePathPatterns("/", "/member/add", "/login", "/logout", "/css/**", "/*.ico", "/error", "/session-info"); }
이렇게 구현한 로그인 기능을 컨트롤러에서 어떻게 member로 받아오는지도 고민을 했었다.
1) SessionConst를 클래스로 만들어준다.
public class SessionConst { public static final String LOGIN_MEMBER = "loginMember"; }
2) HttpSession session
private final HttpSession session; // 세션 선언
컨트롤러에서 세션을 선언한 다음
Member member = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER);
아까 만든 SessionConst를 통해 LOGIN_MEMBER를 받아와서 Member 클래스로 형변환 해준다.
게시글 생성에서의 실제 사용
@PostMapping("/create_post") // 글쓰기 페이지에서 저장을 누르는거 public CreatePostResponse savePost(@RequestBody CreatePostRequest request) { Member member = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER); Post post = new Post(member, request.getTitle(), request.getContent()); Long id = postService.savePost(post); return new CreatePostResponse(id); }
세션을 받아와서 create_post를 할 때 post에 자동으로 member가 세션으로 들어가게 된다.
@PutMapping("/update_post/{postId}") public UpdatePostResponse updatePost(@PathVariable ("postId") Long postId, @RequestBody UpdatePostRequest request) { Member member = (Member) session.getAttribute(SessionConst.LOGIN_MEMBER); Post post = postService.findOne(postId); if(post.getPost_member().getId() == member.getId()) { postService.updatePost(postId, request.getTitle(), request.getContent()); } else { return null; } return new UpdatePostResponse(postId); }
수정이나 삭제를 할 때에도 프론트 개발자가 웹에서 자신의 글에 들어갔을 때에만 수정, 삭제 버튼이 보이게 하겠지만, 여기에서도 변경을 하려는 멤버와 게시글의 멤버가 같아야지만 수정, 삭제가 가능하도록 했다.
이후에도 사진을 올리거나 다른 기능을 할 때에도 세션을 사용해서 로그인된 사용자가 자동으로 처리하는 것으로 만들어 줄 수 있었다.
처음에 프론트 개발자로부터 로그인 기능을 요구받았을 때에는 제대로 구현해본 적도 없었고, 어떻게 해야할지 막막했는데 이전에 정리해놨던 블로그 게시글과 구글링을 통해서 코드를 이해하며 적용할 수 있었다.
백엔드 개발 공부를 할 때 강의를 듣거나 책을 읽는 것으로 끝나는 것이 아니라 블로그 같은 곳에 정리를 해두면 나중에 복습할 수도 있고, 이번처럼 응용할 수도 있기 때문에 개발 블로그의 중요성을 깨닫게 되었다.
'프로젝트 > Trend-Pick' 카테고리의 다른 글
AWS S3를 이용한 사진 저장 (0) 2023.07.31 자바 코드로 정렬 vs db에서 특정 값을 정렬해서 select (0) 2023.07.28 비어있을 수도 있는 객체의 조회 -> Optional 사용 (0) 2023.07.27 @RequestParam과 @RequestBody의 차이점 (0) 2023.07.22 연관관계 사이의 무한 호출 (0) 2023.07.11