개발
Day 49 - Authentication
·2분 읽기
이 글은 2026년 05월 12일 작성된 글입니다.
오늘은 로그인/로그아웃 처리, 작성자 연동, 게시글 수정·삭제 기능과 record 문법까지 정리했다.
1. 폼 에러 공통 요소 분리
<div th:if="${#fields.hasAnyErrors()}">
<div th:each="err : ${#fields.allErrors()}" th:text="${err}"></div>
</div>폼 에러 출력 코드를 공통 요소로 분리했다.
2. 레이아웃 분리
공통 header, navbar, footer 구조를 분리했다.
- 중복 제거
- 유지보수 편리
3. 로그인 폼 구현
<form method="post">
<input type="text" name="username">
<input type="password" name="password">
</form>4. BCryptPasswordEncoder
@Bean
public BCryptPasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}비밀번호를 암호화해서 저장하도록 변경했다.
5. 로그아웃 처리
.logout(logout -> logout.logoutSuccessUrl("/"));로그아웃 후 메인 페이지로 이동하도록 처리했다.
6. 로그인 상태에 따른 메뉴 변경
- 로그인 전 → 로그인 / 회원가입
- 로그인 후 → 로그아웃 / 글작성
7. sec:authentication
<span sec:authentication="name"></span>현재 로그인한 회원 정보를 템플릿에서 출력할 수 있다.
8. 게시글 작성자 연동
@ManyToOne
private Member author;게시글과 회원을 연결했다.
9. Principal 기반 작성자 저장
public String write(Principal principal)현재 로그인한 회원 정보를 기반으로 작성자를 저장했다.
10. 게시글 삭제 기능
@PostMapping("/posts/{id}/delete")삭제 요청을 GET에서 POST 방식으로 변경했다.
11. 게시글 수정 기능
- 수정 폼 구현
- 수정 처리 구현
- 수정 완료 후 상세 페이지 이동
CRUD 중 Update 흐름이 완성되었다.
12. class 대신 record 사용
기존:
public class PostDto {
}변경:
public record PostDto(
String title,
String content
) {
}13. class vs record
| 구분 | class | record |
|---|---|---|
| 용도 | 일반 클래스 | DTO |
| 생성자 | 직접 작성 | 자동 생성 |
| getter | 직접 작성 | 자동 생성 |
| setter | 가능 | 없음 |
| equals/hashCode | 직접 작성 | 자동 생성 |
| 불변성 | 기본 가변 | 기본 불변 |
record는 DTO 작성 시 코드량을 크게 줄일 수 있다.
✅ 정리
- Spring Security를 이용해 로그인과 로그아웃 흐름을 구현할 수 있었다.
- Principal과 author 연동을 통해 게시글 작성자 정보를 저장할 수 있었다.
- 게시글 수정과 삭제 기능까지 구현하면서 CRUD 흐름이 거의 완성되었다.
- record를 사용하면 DTO 클래스를 훨씬 간결하게 작성할 수 있다.