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>
'Framework > Spring' 카테고리의 다른 글
[Spring] OOP와 비교하여 AOP 공부 (0) | 2024.04.17 |
---|---|
[Spring] Security 설정 클래스 생성(세션 Stateless) (0) | 2024.04.17 |
[Spring] DTO (0) | 2024.04.17 |
[Spring] Flyway DB 마이그레이션 (0) | 2024.04.11 |
[Spring] Java 프로젝트 빌드를 위한 Gradle과 Maven의 비교 (0) | 2024.04.09 |