취준/일기

📝 Dev Log | 2025.08.01~04 - 회원관리 프로젝트 분석 - MemberController.java, html 파일, DTO, Entity, Service, Repository

Map of Dev Official 2025. 8. 1. 13:20

📝 아키텍쳐 구조

 

📝 학습 내용

  • Spring Boot로 회원가입/로그인/수정/삭제 CRUD 기능 구현
  • MVC 패턴과 Controller-Service-Repository 계층 구조 실습
  • Thymeleaf 템플릿 엔진과 AJAX 비동기 통신 구현
  • HttpSession 기반 로그인 상태 관리

 

  • 백엔드: Spring Boot 3.5.3, Java 17, JPA/Hibernate
  • 프론트엔드: Thymeleaf, jQuery, HTML/JavaScript
  • DB: MySQL
  • 빌드: Gradle

📝 작동 결과

 

회원가입, 로그인, 목록조회, 상세조회, 수정, 삭제, 로그아웃, 이메일 중복검사가 모두 작동하는 완전한 CRUD 시스템

📝 코드

package com.codingrecipe.member.controller;

import com.codingrecipe.member.dto.MemberDTO;
import com.codingrecipe.member.service.MemberService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpSession;
import java.util.List;

@Controller
@RequiredArgsConstructor
public class MemberController {
    private final MemberService memberService;

    @GetMapping("/member/save") //회원가입페이지요청
    public String saveForm() {
        return "save"; //회원가입페이지이동
    }

    @PostMapping("/member/save") //회원가입정보입력
    public String save(@ModelAttribute MemberDTO memberDTO) { //입력값자동DTO매핑
        System.out.println("MemberController.save"); //로그출력
        System.out.println("memberDTO = " + memberDTO); //입력값확인
        memberService.save(memberDTO);
        return "login";
    }

    @GetMapping("/member/login") //로그인페이지요청
    public String loginForm() {
        return "login";
    }

    @PostMapping("/member/login") //로그인정보입력
    public String login(@ModelAttribute MemberDTO memberDTO, HttpSession session) { //DTO매핑(회원정보), null 세션(로그인유지용임시정보)
        MemberDTO loginResult = memberService.login(memberDTO); //로그인처리

        if (loginResult != null) { //로그인성공
            session.setAttribute("loginEmail", loginResult.getMemberEmail()); //세션저장
            return "main";
        } else { //실패
            return "login";
        }
    }

    @GetMapping("/member/") //전체회원목록요청
    public String findAll(Model model) { //데이터전달용Model주입
        List<MemberDTO> memberDTOList = memberService.findAll(); //전체회원조회처리
        model.addAttribute("memberList", memberDTOList); //목록데이터전달
        return "list";
    }

    @GetMapping("/member/{id}") //회원상세정보요청
    public String findById(@PathVariable Long id, Model model) { //경로변수추출 데이터전달용Model주입
        MemberDTO memberDTO = memberService.findById(id); //회원정보조회처리
        model.addAttribute("member", memberDTO); //상세정보전달
        return "detail";
    }

    @GetMapping("/member/update") //회원정보수정페이지요청 (∴ 기존 정보 제공)
    public String updateForm(HttpSession session, Model model) {
        String myEmail = (String) session.getAttribute("loginEmail"); //이메일추출
        MemberDTO memberDTO = memberService.updateForm(myEmail); //db정보에 있는지 확인 및 회원정보 추출
        model.addAttribute("updateMember", memberDTO); //회원정보제공
        return "update";
    }

    @PostMapping("/member/update") //회원정보수정입력
    public String update(@ModelAttribute MemberDTO memberDTO) {
        memberService.update(memberDTO); //회원정보수정처리
        return "redirect:/member/" + memberDTO.getId();
    }

    @GetMapping("/member/delete/{id}") //회원삭제요청
    public String deleteById(@PathVariable Long id) {
        memberService.deleteById(id);
        return "redirect:/member/";
    }

    @GetMapping("/member/logout") //로그아웃요청
    public String logout(HttpSession session) {
        session.invalidate(); //세션삭제
        return "index"; //메인페이지이동
    }

    @PostMapping("/member/email-check") //이메일중복검사요청
    public @ResponseBody String emailCheck(@RequestParam("memberEmail") String memberEmail) { //JSON응답반환 파라미터추출
        System.out.println("memberEmail = " + memberEmail); //입력값확인
        String checkResult = memberService.emailCheck(memberEmail); //중복검사처리
        return checkResult;
    }
}

🏷️ 기술 스택

Spring Boot, Spring MVC, Thymeleaf, Lombok, HttpSession, Ajax

🔍 핵심 포인트 정리

  • @Controller: Spring MVC에서 웹 요청을 처리하는 컨트롤러 클래스로 지정하는 어노테이션
  • @RequiredArgsConstructor: Lombok에서 final 필드들의 생성자를 자동으로 생성해주는 어노테이션
  • @GetMapping/@PostMapping: HTTP GET/POST 요청을 특정 URL과 매핑하는 Spring 어노테이션
  • @ModelAttribute: HTML 폼 데이터를 자동으로 객체에 바인딩해주는 Spring 어노테이션
  • @PathVariable: URL 경로의 변수 값을 메서드 파라미터로 바인딩하는 Spring 어노테이션
  • @ResponseBody: 메서드 반환값을 HTTP 응답 본문으로 직접 전송하는 Spring 어노테이션
  • HttpSession: 사용자 로그인 상태를 유지하기 위한 세션 관리 객체
  • Model: 컨트롤러에서 뷰로 데이터를 전달하기 위한 Spring MVC 객체

📅 Weekly Goals (8/1 - 8/7)

🎯 Member Management Project

ㆍ 진행률 : 14/14 파일 완료 ████████████  100%

🧮 알고리즘

ㆍ BFS 문제 : 백준 1926번 그림 문제 코드 완전 암기

"작은 진전이라도 매일 쌓이면 큰 변화가 된다"