2024. 1. 17. 21:01ㆍTIL
어젠는 회원가입, 로그인, 로그아웃을 구현했다면
오늘은 인증/인가 기능의 기반을 마련했고, 내일은 오늘한 작업에 이어서 각 컨트롤러에 인증/인가를 위한 코드만 몇줄 추가해주면 된다.
거기에 이어서 내일은 내가 받은 피드백을 반영해서 기존코드들도 조금더 손을 보는 작업을 해볼 예정이다.
일단 오늘 인증/인가의 기반을 완성하고 내일 진행할 코딩을 위해서 살짝 연습을 해보았는데,
게시글이나 댓글을 작성하면 자동으로 유저의 Id값이 남아서 누가 작성했는지 알수 있고, 본인이 작성한 게시글이나 댓글이 아니라면 수정과 삭제를 하지 못하도록 하는게 목표이다.
그러려면 현재 로그인한 사람의 userId값이 CRUD 중 R을 제외하고 CUD에 남아있어야한다.
여기서 이제 내가 NewsFeedProject에서 다른 팀원이 도와주었던 코드를 가져와서
@AuthenticationPrincipal user: ??
를 입력했는데 이는 현재 로그인한 사람의 토큰을 가져오는 어노테이션인듯 하다.
그럼 이제 ??에 들어갈 부분이 문제인데 새로 작성한 파일목록중에서 userId값이 들어간 파일을 불러와야한다.
일단 파일중에 UserPrincipal 이란 파일이 눈에 띄었다.
package com.example.mytodoapp.infra.swagger.security
import org.springframework.security.core.GrantedAuthority
import org.springframework.security.core.authority.SimpleGrantedAuthority
data class UserPrincipal(
val id: Long,
val email: String,
val authorities: Collection<GrantedAuthority>
) {
constructor(id: Long, email: String, roles: Set<String>) : this(
id,
email,
roles.map { SimpleGrantedAuthority("ROLE_$it" ) })
}
이 UserPrincipal을 넣어서 여기에 있는 id를 저장하는 코드를 짜보면 어떨까 하는 생각이 들었고,
일단 작성해보자 라는 생각으로 TodoCardController 부분에 적어보았다.
@PostMapping
@PreAuthorize("hasRole('ADMIN') or hasRole('USER')")
fun createTodoCard(
@AuthenticationPrincipal user: UserPrincipal //여기서 불러오고
)
: ResponseEntity<TodoCardResponse> {
return ResponseEntity
.status(HttpStatus.CREATED)
.body(todoCardService.createTodoCard(user.id)) //id값을 건내준다.
}
이렇게하고 TodoCardServiceImpl에는
받아온 Id를 이용해 유저를 찾아주었다.
@Transactional
override fun createTodoCard(userId: Long): TodoCardResponse {
val user = userRepository.findByIdOrNull(userId)
?: throw ModelNotFoundException("User", userId) //id값으로 해당 유저를 찾아온다.
return todoCardRepository.save(
TodoCard(
name = user.name,
user = user,
)
).toResponse()
}
기대반 걱정반으로 직접 테스트해보았고 결과로는 로그인한 유저의 id값이 제대로 잘 남으면서 상당히 뿌듯함을 느낄수 있었다.
일단 잘 작동되는 것도 확인 되었으니 오늘은 TodoCard 쪽만 코드를 추가해줬다.
오늘 배운 JPA 관련 기록
처음에는 어렵게 생각했는데 한번 배우고나니 꽤나 이해하는데 도움이 되었다.
우선 JPA란 Kotlin 코딩 단계에서 쿼리나 DB에 대한 코드작성법을 따로 알필요 없이 알아서 DB에 CRUD를 도와주는 기능 이란것을 알았다.
내가 쓴 JPA로는 Repository 부분에 JpaRepository 를 상속받은 부분이다.
JPA 5가지 특징
1차캐시
DB와 요청간의 사이에 1차적으로 저장하고 있는 데이터
동일성 보장
같은 트랜잭션에서 에서 가져온 객체는 항상 동일한 객체를 리턴한다.
쓰기지연
1차 캐시 처럼 쓰기지연 SQL 저장소에 저장해놨다가 commit 될때 한번에 DB에 저장한다.
더티체킹
별도의 세이브작업 없이 메소드 안에서 바꾸기만해도 알아서 저장을 해주는 기능
지연로딩
엔티티에서 해당 엔티티를 불러올때 SQL을 날려 해당 데이터를 가져온다.
오늘의 한마디 : 오늘은 코딩이 생각보다 잘 풀린것과 이해못했던 JPA에 대해 확실히 알수있어서 뿌듯하다.
'TIL' 카테고리의 다른 글
20240119 (금) 코딩일지 (0) | 2024.01.19 |
---|---|
20240118 (목) TodoApp 개발 마무리 및 추가 공부 (0) | 2024.01.18 |
20240116 (화) 코틀린 + 스프링 심화과정 개인공부(화~금) (0) | 2024.01.16 |
20240115 (월) 뉴스피드프로젝트 발표 및 KPT 회고 (0) | 2024.01.15 |
20240112 (금) 뉴스피드프로젝트 개발 마루리 및 발표 대본 작성 (1) | 2024.01.12 |