Framework/Spring

[Spring] 회원가입 코드 통해 스프링 구조와 흐름 복습하기

JM Lee 2024. 4. 11. 17:57
728x90

복기하는 내용은 각 코드 주석에 상세히 달아보면서 복습

 

필요한 의존성을 추가하고 스프링 부트 애플리케이션을 설정해야 하므로, build.gradle 또는 pom.xml 파일에 아래와 같이 의존성을 추가

<!-- build.gradle -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

 

 

회원 엔티티를 추가

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity #엔티티 어노테이션
public class User {
    @Id # 해당 필드가 PK
    @GeneratedValue(strategy = GenerationType.IDENTITY) # 기본 키 값이 자동 생성
    private Long id; # 기본 키
    private String username;
    private String password;
    // getters and setters # 엔티티 클래스에서는 보통 필드에 접근하기 위한 getter와 setter 메서드를 제공
    # 현재는 생략
}
# Private으로 설정하여 외부 노출 x

 

 

UserRepository 인터페이스 작성

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

# JPA를 상속받는 UserRepository 생성,User라는 엔티티 이름은 PK 데이터 타입은 Long
# User findByUsername(String username);: 이 메서드는 사용자의 이름(username)으로 사용자를 검색하는데 사용
# 스프링에 내장된 메서드

 

회원가입 처리할 컨트롤러 작성

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;

@Controller
public class RegistrationController {
    @Autowired
    # 이 어노테이션은 의존성 주입을 수행하는데 사용
    # 여기서는 UserRepository라는 스프링 빈을 주입받아 사용
    private UserRepository userRepository;

    @GetMapping("/signup") # Get HTTP 요청
    public String showSignUpForm(Model model) {
        model.addAttribute("user", new User());
        return "signup";
    } # 회원가입 페이지를 보여주는 역할

    @PostMapping("/signup") # Post HTTP 요청
    public String signUp(User user, RedirectAttributes redirectAttributes) {
        try {
            BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); # 비밀번호 해싱
            user.setPassword(passwordEncoder.encode(user.getPassword()));
            userRepository.save(user);
            return "redirect:/login";
        } catch (Exception e) {
            // 예외가 발생하면 에러 메시지를 리다이렉트 속성에 추가하여 회원가입 페이지로 리다이렉트
            redirectAttributes.addFlashAttribute("error", "회원가입 중 오류가 발생했습니다.");
            return "redirect:/signup";
        }
    }
}

 

회원가입 폼 처리할 Thymeleaf 생성

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Sign Up</title>
</head>
<body>
    <h2>Sign Up</h2>
    <form th:action="@{/signup}" th:object="${user}" method="post">
        <div>
            <label for="username">Username:</label>
            <input type="text" id="username" th:field="*{username}">
        </div>
        <div>
            <label for="password">Password:</label>
            <input type="password" id="password" th:field="*{password}">
        </div>
        <button type="submit">Sign Up</button>
    </form>
</body>
</html>