할 일
- 카드에 완료여부 추가하기
- 생성시간 Entity 따로 만들기
- 댓글 기능
-단일 카드 조회 시 댓글도 같이 보이도록
깃 사용은 언제 익숙해질까...2단계 브랜치 생성하고 새 프로젝트로 땡겨와서 쓰려고 했는데 잘 안돼서 그냥 하던 프로젝트에서 계속해야겠다...단계별로 나눠놓고 최종적으로 만든 것만 main에 병합해주면 되겠지?
1 완료여부 추가
수강신청어플리케이션에서는 enum 클래스를 활용하여 상태를 나타냈다.
투드리스트 요구사항에 true 아니면 false라고 되어있어서 마찬가지로 따라해봤다.
테스트에서 update 할 때 status에 TRUE나 FALSE 가 아닌 다른 값을 넣으면 값이 변하지 않고 어떤 오류도 없이 그대로 나온다. 다른 값을 집어넣었을 때 예외처리하는 방법이 없나? 댓글 완성하면 해봐야겠다.
2 댓글 작성/수정/삭제
controller 작성까지 하고 service 를 어디에 넣을까 고민했다.
수강신청에서는 lecture 와 coureseApplication 둘 다 course 와 관련 있고 하위에 있는 것들이라서 courseService에서 같이 처리했었다. comment 도 각 투드 카드에 속해 있는 애들이니 service를 같이 다뤄야 하는 건가? comment service 에 들어갈 내용도 수정삭제 밖에 없고 조회는 카드를 조회할 때 같이 조회되는 거니 cardService랑 같이 넣어야 겠다.
댓글이랑 카드 관계설정하는데 어렵다.
비밀번호 검사만드는데 자꾸 막혀서
삭제 구현먼저하는데 타입매칭오류가 자꾸 날 막는다 😫
여기 어디에 도대체 Card 타입이 있다는거지
=> Service에 Repository 주입할 때 타입을 잘못 적었다...^^!
발생하는 모든 오류가 전부 내 덕분이라 탓할 곳도 없다 ^^!
선택한 카드를 조회할 때 그 카드아이디를 가지고 있는 댓글도 같이 조회할 수 있도록
반환타입을 카드와 댓글목록을 가지고 있는 데이터 클래스로 바꾸어주었다.
그런데 댓글을 id로 찾아서 가져온걸 map 메소드에 집어넣으려고 하니 사용이 불가하다고 뜬다.
목록 조회할 때는 사용이 잘 됐었다.
findAll() 일 때는 map적용이 가능했지만 id로 구분해서 찾아온 값은 unit 타입이라 적용이 안된다.
그래서 명시적으로 List로 변환 시켜서 적용했다.
override fun getCard(cardId: Long): CardWithCommentResponse {
val card = cardRepository.findByIdOrNull(cardId) ?: throw ModelNotFoundException("Card", cardId)
val comments = commentRepository.findByCardId(cardId).toList().map { it.toResponse() }
return CardWithCommentResponse(card.toResponse(), comments)
}
댓글 작성 테스트
card entity 와 comment entity 연결이 안된 것 같아서 확인해보니
@OnetoMany 에 mappedBy 설정을 안해줬었다.
fk를 들고 있지 않은 card 를 입력해주니 정상적으로 댓글 작성이 된다.
양방향 단방향 모르겠어서 일단 강의대로 양방향설정을 했다.
이제 비밀번호 검사🥲
아까 비밀번호 검사 만들 땐 그렇게 헤매서 막혔었는데 댓글 작성 완성하고 돌아오니 바로 구현이 됐다!🙄
아깐 쿼리도 새로만들고 그랬는데 대체 왜 그랬지...?
// 비밀번호 검사
if(request.name != comment.name || request.password != comment.password) throw UnauthorizedAccess("name")
비밀번호 검사 테스트
올바르지 않은 cardId/commentId 를 입력했을 때/이름이나 비밀번호가 일치하지 않을 때 모두 정상적으로 나온다.
그런데 cardId 랑 commentId 둘 다 잘못입력했을 때 에러메시지가 cardId 경우만 나온다.
card 에러가 먼저 throw 돼서 그런 것 같은데 같이 나올 수 있게 하는 방법이 없나?
댓글 삭제도 정상적으로 됐다. 이제 삭제가 성공했다는 메시지와 상태코드를 만들면 된다.
에러메시지랑은 다른건가? 상태코드는 No_CONTENT 204 이걸 그대로 보내면 되는거 아닌가?
모르겠다. 내일 고민해보고 다른걸 하자.
🚩의존성
implementation("org.springframework.boot:spring-boot-starter-web")
: Spring MVC를 사용한 RESTful 서비스를 개발하는데 사용
implementation("com.fasterxml.jackson.module:jackson-module-kotlin")
: data 클래스는 빈 생성자를 가질 수 없다/주생성자를 사용한 일반 클래스는 빈 생성자가 없다
=> 이를 개선하기 위해 사용
https://proandroiddev.com/parsing-optional-values-with-jackson-and-kotlin-36f6f63868ef
implementation("org.jetbrains.kotlin:kotlin-reflect")
: 코테하면서 잠깐 봤던 리플렉션을 위한 의존성
implementation("org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0")
: swagger 사용
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
: JPA
implementation("com.h2database:h2")
: h2 데이터베이스
runtimeOnly("org.postgresql:postgresql")
: postgre 드라이버
annotationProcessor("org.springframework.boot:spring-boot-configuration-processor")
: configuration 메타데이터 생성 자동화
*configuration 메타데이터 : sping 컨테이너가 객체를 어떻게 생성할 것인지 표현하기 위한 데이터
testImplementation("org.springframework.boot:spring-boot-starter-test")
: test 를 위 한 도구
fun main(args: Array<String>) { runApplication<ToDoStep1Application>(*args)}
코틀린의 시작점 fun main
runApplication - spring boot 애플리케이션 초기화, 실행
내일 할 일
삭제성공메시지, 생성시간 Entity 분리 -> step2완성
책 목차 훑어보고 읽기 시작
네트워크는 인터넷 강의 보고 다시 읽어봐야겠다.
'왕초보일지' 카테고리의 다른 글
231230 | TIL (0) | 2023.12.30 |
---|---|
231229 TIL | 스프링 부트 3 기본 지식 (2) | 2023.12.29 |
231227 | Todo Step1 (0) | 2023.12.27 |
231226 | Entity 작성, Service layer 연결 (0) | 2023.12.26 |
231222 TIL | (1) | 2023.12.22 |