3주차 마무리, 중간 발표 전 각자 작업물 완료하고 목표치만큼의 전체 테스트를 다같이 수행했다.
오류 작성 페이지를 만들어서 발견한 오류를 기록, 해결상태 표시, 개선 방향을 작성했다.
에러 기록해둔다는걸 잊어서 내용이 부실하다.🤯
1. .env 파일 적용 X
.env 파일에서 환경변수를 불러오지 못하고 있었다.
며칠 전에 기존에 사용하던 라이브러리에서
implementation("me.pqulschwarz:spring-dotenv:4.0.0")
⬇️
implementation("io.github.cdimascio:dotenv-java:3.0.0")
직접 호출이 가능한 cdimascio 라이브러리로 교체를 했었다.
그 이후로는 컨테이너 안에서 직접 파일을 작성해넣었기 때문에 로컬에서 문제가 일어난 줄은 몰랐다.
변수를 읽지 못해 로컬 실행 자체가 안되는 상황에 이전에 쓰던 라이브러리를 추가로 집어넣으니 해결이 됐다.
분명 paulschwarz 라이브러리는 빌드과정에서 parser 에러를 내서 dotenv 로 교체한건데
지금 상황은 paulschwarz 가 변수를 잘 읽어와주고 있다........
정확한 원인을 알아먹지 못해서 마음이 불편하다
둘 다 해당 깃헙에 비슷한 이슈가 올라와있는데 업데이트가 없다 🥲
2. 댓글, 모임 생성 시 역직렬화 에러
보통 필드가 하나인 경우에 이런 에러가 나온다는데 모임같은 경우는 전혀 해당사항이 없었다.
서치를 해봐도 일치하는 상황이 드물었다.
기본값을 일일이 주거나 JsonProperty 어노테이션을 하나하나 달아주는건 번거로운 것 같아 다른 해결책을 찾았다.
해결
objectMapper.registerKotlinModule()
objectMapper config 에 위의 모듈을 추가했다.
3. LocalDateTime() 이 Array 로 출력됨
이전에는 멀쩡한 형식으로 나오던 시간이 오늘 테스트를 진행하는데 갑자기 처음 보는 배열 형태로 출력되었다.
2024-03-15 -> [ 2024, 03, 15 ]
해결
objectMapper.setDateFormat(StdDateFormat().withColonInTimeZone(true)
마찬가지로 objectMapper config 에 날짜 형식 설정을 추가했다.
@Configuration
class MapperConfig {
@Bean
fun objectMapper(): ObjectMapper {
val objectMapper = ObjectMapper()
objectMapper.registerModule(JavaTimeModule())
objectMapper.disable(SerializationFeature.WRITE_DATE_KEYS_AS_TIMESTAMPS)
objectMapper.registerKotlinModule()
objectMapper.setDateFormat(StdDateFormat().withColonInTimeZone(true))
return objectMapper
}
}
4. 영화 검색 시 poster_path 를 null 로 인식하고 MissingKotlinParameterException 발생
com.fasterxml.jackson.module.kotlin.MissingKotlinParameterException:
Instantiation of
[simple type, class org.spartaa3.movietogather.domain.api.service.dto.response.MovieResponse]
value failed for JSON property poster_path
due to missing (therefore NULL) value for creator parameter poster_path
which is a non-nullable type
위의 에러는 nullable 하지 않은 필드에 null 값을 받아 json 에러가 발생한다고 하는데
직접 api url 로 호출해서 받아본 결괏값엔 null 값이 포함되어있지 않았다.....null 이 없는데 왜 null 이 들어왔다고 하는 걸까..
일단 이 상황 해결 + 혹시나 모를 진짜로 url 이 null 값일 경우에 대비하여
poster_path 를 nullable 하게 바꾸고 null 이 들어올 경우 기본이미지를 주었다.
5. 댓글 삭제 안 됨
comments delete 로직을 실행했을 때 결과메시지는 잘 나오는데 실제로 확인해보면 삭제가 이루어지지 않았다.
쿼리도 select 쿼리만 날아가는 상황
@Transactional
override fun deleteComments(reviewId: Long, commentsId: Long) {
val review = reviewRepository.findByIdOrNull(reviewId) ?: throw ReviewNotFoundException("Review", reviewId)
val comments =
commentsRepository.findByIdOrNull(commentsId) ?: throw ReviewNotFoundException("Comments", commentsId)
commentsRepository.delete(comments)
}
review 를 검사하는 로직을 주석처리했을 때 정상적으로 됐다.
왜?? 더 검사해보다가 관련있는 것 같은 블로그 글을 찾았다.
https://velog.io/@jkijki12/JPA-Entity%EA%B0%80-delete%EA%B0%80-%EC%95%88%EB%90%9C%EB%8B%A4
comments 를 가지고 있는 review 를 transaction 안에서 한 번 가지고 왔다. (사용은 안했지만)
commentsRepository 에서 찾아온 comments 를 삭제다고 해도
review 의 comments 리스트에서 해당 comments 를 삭제해주지 않으면
영속성 컨텍스트는 여전히 그 comments 를 review 의 일부로 간주하고
더티체킹 때 데이터베이스와 동기화시키면서
review 가 해당 comments 를 계속 참조하는 것으로 확인하고 예상치 못한 동작을 발생하는 것
review 의 comments 를 삭제하는 로직을 추가해넣었다.
같은 문제를 분명 더티체킹 공부할 때 봤었던 것 같은데 이번에 확실하게 기억하고 넘어가야겠다.
주말에 해야할 일
- 3주차 완성본으로 서버 띄우고 elasticCache 연결하기
- 모니터링 서버와 연결하고 테스트
- 시연 영상 녹화하기
- 발표 준비 (스크립트 짜주신 팀장님 덕분에 넘 든든하다...)
- 프론트 데이터 붙이기
서버 띄울 때 예상치 못한 에러가 또 우후죽순 튀어나올까봐 두근거린다.😍
'왕초보일지' 카테고리의 다른 글
GitHub Actions + Docker + EC2 (+ S3) 을 활용한 배포 (1) | 2024.04.03 |
---|---|
TMDB 영화 Open API 구현 (0) | 2024.04.03 |
스프링 부트 build contextLoads() Failed (1) | 2024.03.06 |
240227 TIL | ERD 설계 고민 (2) | 2024.02.29 |
240223 TIL | (0) | 2024.02.23 |