ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 로그인 세션으로 자동 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);
        }

    수정이나 삭제를 할 때에도 프론트 개발자가 웹에서 자신의 글에 들어갔을 때에만 수정, 삭제 버튼이 보이게 하겠지만, 여기에서도 변경을 하려는 멤버와 게시글의 멤버가 같아야지만 수정, 삭제가 가능하도록 했다.

     

     

    이후에도 사진을 올리거나 다른 기능을 할 때에도 세션을 사용해서 로그인된 사용자가 자동으로 처리하는 것으로 만들어 줄 수 있었다.

     

     

     

    처음에 프론트 개발자로부터 로그인 기능을 요구받았을 때에는 제대로 구현해본 적도 없었고, 어떻게 해야할지 막막했는데 이전에 정리해놨던 블로그 게시글과 구글링을 통해서 코드를 이해하며 적용할 수 있었다.

    백엔드 개발 공부를 할 때 강의를 듣거나 책을 읽는 것으로 끝나는 것이 아니라 블로그 같은 곳에 정리를 해두면 나중에 복습할 수도 있고, 이번처럼 응용할 수도 있기 때문에 개발 블로그의 중요성을 깨닫게 되었다.

Designed by Tistory.