완료여부 api 분리
@Controller
@Service
security 적용
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("io.jsonwebtoken:jjwt-api:0.12.3")
runtimeOnly("io.jsonwebtoken:jjwt-impl:0.12.3")
runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.12.3")
시큐리티 로깅 (yml)
logging:
level:
org:
hibernate:
SQL: debug
orm:
jdbc:
bind: trace
springframework:
security: debug
토큰에 id, email, role 말고도 nickname 을 저장해넣었는데
카드를 작성할 때 holder 에서 꺼내지지가 않았다.
val authentication = SecurityContextHolder.getContext().authentication as JwtAuthenticationToken
val nickname = authentication.principal.nickname
강제로 변환하고 나서야 nickname 에 접근이 가능했다.
우리가 지금 사용하고 있는 JwtAuthenticationToken 은 authentication 의 구현체이고
authentication 을 가져올 때 그 jwtAuthenticationToken 의 형태로 가져와라 그래야 직접 구현한 그 안의 데이터를 꺼낼 수 있다?
Kotlin DSL
kotest mockk
문서 숙지하는게 이해하는데 제일 편하다고 함.. .
강의 따라서 투두의 테스트코드를 작성해봤다.
@SpringBootTest // 나 테스트할거야
@AutoConfigureMockMvc // mockmvc 주입
@ExtendWith(MockKExtension::class) // mock 쓸 때 표기해줄 것
class CardControllerTest @Autowired constructor(
private val mockMvc: MockMvc, private val jwtPlugin: JwtPlugin // @Autowired 로 직접 빈 주입
): DescribeSpec({
extension(SpringExtension)
afterContainer {
clearAllMocks()
}
val cardService = mockk<CardService>()
describe("GET /cards/{cardId}") {
context("존재하는 id를 요청할 때") {
it("200 status code 를 응답한다.") {
val cardId = 2L
every { cardService.getCard(any()) } returns CardWithCommentResponse(
card = CardResponse(
id = cardId,
title = "test_title",
content = "test_content",
name = "test_name",
createdAt = "test_time",
status = CardStatus.FALSE
),
comments = mutableListOf()
)
val jwtToken = jwtPlugin.generateAccessToken(
subject = "2",
email = "test@email",
nickname = "test_nickname",
role = "USER"
)
val result = mockMvc.perform(
get("/cards/$cardId")
.header("Authorization", "Bearer $jwtToken")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
).andReturn()
result.response.status shouldBe 200 // 결과
val cardId2 = 1L
val result2 = mockMvc.perform(
get("/cards/$cardId2")
.header("Authorization", "Bearer $jwtToken")
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
).andReturn()
result2.response.status shouldBe 404
}
}
}
})
처음에 card id 를 1로했다가 오류가 떴었는데 id가1인 카드가 존재하지 않아서였다.
성공했을 때, 실패했을 때 둘 다 해야한다길래 아래에다가 두번째 카드 아이디 할당해서 만들었다. 이게 맞는지는 모르겠다.
테스트코드에서 쓰이는 함수가 상당히 많던데 그때그때 찾아서 써야되는 것 같다.
오늘 투두에 시큐리티 적용하고 하루종일 강의듣다 다 갔다.
심화에 어려운 개념들이 다 몰려있어서 목요일이 되도록 강의를 붙잡고 있었다.
테스트 코드 두 번 들으면서 겨우 한 번 작성해봤는데
AOP도 한 번더 들어봐야한다. 공통된 부분을 분리해서 모듈화한다! 이 정도까지만 이해했고 혼자서 만들지는 못하겠다.
원래 오늘 투두 다 하고 배포해봐야지! 이랬었는데 강의를 다 못들었다는 불안함에 결국 못했다.
내일 과제 제출 마감 전에 투두 스웨서 테스트 한 번 더 하고
엔티티랑 서비스 테스트코드 작성
QueryDSL 강의 빠르게 한 번 더 듣고 적용할 수 있는거 적용해봐야겠다. 그리고나서 배포 따라해보기!
너무 피곤한데 잠 좀 푹 자보고 싶다...
'왕초보일지' 카테고리의 다른 글
240122 TIL | (0) | 2024.01.22 |
---|---|
240119 TIL | (1) | 2024.01.19 |
240117 TIL | 시큐리티 예외처리, queryDSL (0) | 2024.01.17 |
240116 TIL | (0) | 2024.01.16 |
240113 TIL | (1) | 2024.01.13 |