반응형
이번 수업에서는 Spring Security를 통한 사용자 인증 기반 회원가입 기능을 구현하고, 게시판의 페이징 UI도 개선하였습니다. 사용자 데이터 저장, 비밀번호 암호화, 입력 검증 등 실전 프로젝트에서 필수적인 기능들을 학습하였습니다.
1. 📄 게시판 페이징 UI 개선
<td th:text="${paging.getTotalElements - (paging.number * paging.size) - loop.index}"></td>
- 게시글 번호를 전체 글 수 기준으로 역순 출력하기 위한 계산식 사용
예: 전체 100개일 경우 첫 번째 페이지의 첫 글은 100번, 다음은 99번...
<span class="text-danger small ms-0"
th:if="${#lists.size(question.answerList) > 0}"
th:text="|[${#lists.size(question.answerList)}]|"></span>
- 댓글 수가 1개 이상인 경우 표시: [3]처럼 표시됨
2. 🔐 Spring Security 기본 설정
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
http.authorizeHttpRequests(auth ->
auth.requestMatchers("/**").permitAll()
);
return http.build();
}
@Bean
PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
}
- @EnableWebSecurity로 Spring Security 활성화
- filterChain()으로 모든 요청을 인증 없이 허용 (개발 단계용)
- BCryptPasswordEncoder로 비밀번호 암호화
3. 👤 회원 엔티티 및 저장
📦 SiteUser
@Getter
@Setter
@Entity
public class SiteUser {
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
@Column(unique = true)
private String username;
private String password;
@Column(unique = true)
private String email;
}
- 사용자 아이디와 이메일은 중복 불가(unique)
- 비밀번호는 암호화 저장
4. 🛠 사용자 등록 서비스
public SiteUser create(String username, String email, String password) {
SiteUser user = new SiteUser();
user.setUsername(username);
user.setEmail(email);
user.setPassword(passwordEncoder.encode(password));
return userRepository.save(user);
}
- 비밀번호는 반드시 암호화 후 저장
- 저장 시점에 userRepository.save(user)
5. 📋 회원가입 폼과 검증
📑 UserForm
@NotEmpty(message = "아이디가 비어있습니다.")
@Size(min = 3, max = 15)
private String username;
@NotEmpty(message = "비밀번호가 비어있습니다.")
private String password;
private String passwordCheck;
@Email
@NotEmpty(message = "이메일이 비어있습니다.")
private String email;
📎 UserController
@PostMapping("/signup")
public String signup(@Valid UserForm userForm, BindingResult bindingResult) {
if (bindingResult.hasErrors()) return "signup_form";
if (!userForm.getPassword().equals(userForm.getPasswordCheck())) {
bindingResult.rejectValue("passwordCheck", "passwordincorrect", "비밀번호가 서로 다릅니다.");
return "signup_form";
}
this.userService.create(userForm.getUsername(), userForm.getEmail(), userForm.getPassword());
return "redirect:/";
}
- @Valid로 입력 검증
- 비밀번호 일치 확인
- 에러가 있으면 같은 폼 재출력
6. 🖥 회원가입 페이지 (Thymeleaf)
<form th:action="@{/user/signup}" method="post" th:object="${userForm}">
<div th:replace="~{form_errors :: formErrorsFragment}"></div>
...
</form>
- 입력 검증 결과는 공통 에러 조각 (form_errors) 으로 처리
- th:field="*{필드명}"으로 바인딩
💡 포인트 정리
- Spring Security로 회원 인증 구조 기본 설정
- 사용자 입력 검증 및 비밀번호 암호화 적용
- BCryptPasswordEncoder는 보안상 안전한 해시 알고리즘
- Thymeleaf와 Spring Validation을 활용한 입력값 검증 및 에러 처리
- 게시판 UI에서 댓글 수 및 글 번호를 가독성 있게 개선
📌 정리하자면, 58일차에는 Spring Security 기반의 사용자 가입 기능을 처음으로 도입했습니다. 암호화된 비밀번호 저장, 입력 검증, 폼 유효성 체크까지 실제 서비스에서 꼭 필요한 인증의 기초를 실습했습니다.
'국비' 카테고리의 다른 글
[ 59일차 29 ] 수업 정리 - Spring boot (0) | 2025.07.10 |
---|---|
[ 57일 22강 ] 수업 정리 - Spring boot (1) | 2025.07.09 |
[ 56일차 18~21 ] 수업 정리 - Spring boot (0) | 2025.07.07 |
[ 55일차 ] 복습 (0) | 2025.07.04 |
[ 54일차 15~17 ] 수업 정리 - Spring boot (2) | 2025.07.03 |
[ 53일차 8~14 ] 수업 정리 - Spring boot (0) | 2025.07.02 |