왕초보일지

231228 TIL |

다시은 2023. 12. 28. 21:01

할 일 

- 카드에 완료여부 추가하기

- 생성시간 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완성

책 목차 훑어보고 읽기 시작

 

네트워크는 인터넷 강의 보고 다시 읽어봐야겠다.