OAuth2 로그인 클론코딩 한번하고 과제 해설영상을 봤다.
카카오톡 로그인 창이 뜨고 인증도 했는데 토큰샘플이 화면에 뜨질 않아서 한참 찾아보니까 개인정보 동의항목의 닉네임 동의 설정을 안했었다.🥲 동의해주니 정상적으로 뜬다.
과제 코드 공부
📌내가 작성한 것과 뭐가 다른지 찾아보며 이해하기
Object
해당 클래스를 정의함과 동시에 해당 클래스의 단일 인스턴스를 생성
Companion Object
: 클래스가 메모리에 올라갈 때 동시에 companion object가 인스턴스로서 힙에 올라간다고 해서 동반객체라고 한다.
data class CardResponse(
var id: Long?,
var status: CardStatus,
var title: String,
var content: String?,
var createdAt: String,
var name: String
) {
companion object{
fun from(card: Card): CardResponse {
return CardResponse(
id = card.id,
status = card.status,
title = card.title,
content = card.content,
createdAt = card.createdAt,
name = card.name
)
}
}
CardResponse.from(card:Card)
바로 호출 가능.
DTO로 변환할 때 Entity 내에서 함수를 만들어줬었는데 답안코드에서는 DTO 클래스에 내부에서 Companion Object 로 만들어주고 있다. 반환형태의 변경사항이 생겼을 때 수정하기 더 수월함.
내가 댓글과 같이 반환시키려고 새로운 클래스를 만들고 파라미터를 리스트로 받고 이걸 어떻게 반환시키나 헤맸었는데 이런 방법도 있다는 것 알게 되었다.
답안에서는 카드생성클래스나 수정클래스에서 받아온 데이터를 엔티티객체로 만들고 반환할때 DTO로 반환하고 있다.
카드 수정 부분 save 차이
영속성 컨텍스트는 엔티티를 처음 조회할 때 시작! (영속상태)
이후 변경을 감지해서 (Dirty Checking) 트랜잭션이 끝나는 시점에 변화가 있는 모든 엔티티 객체를 DB에 반영한다.
'변화가 있다'의 기준은 최초 조회 상태이다.
왼쪽은 repository에서 직접 조회해서 값을 할당해 업데이트해준 것.
오른쪽은 클라이언트에서 받아온 값을 그대로 save 해줬는데 동일한 id를 가진 데이터가 이미 존재하므로 jpa가 해당 데이터를 업데이트 해준다. save 는 새로운 엔티티를 저장하거나 이미 존재하는 엔티티를 업데이트 해준다!
변경된 필드만 업데이트 되도록 하고자 한다면 @DynamicUpdate 를 엔티티에 붙여준다.
상태 변환
@Column(name = "is_completed")
private var _isCompleted: Boolean = false
val isCompleted: Boolean
get() = _isCompleted
fun complete() {
_isCompleted = true
}
컬럼인 _isCompleted 는 private 로 외부에서 TodoCard.isCompleted = true 이런식으로 값을 바꿀 수 없다.
값을 불러오려면 isCompleted를 호출하면 된다.
값을 변경하려면 complete() 메소드로만 변경할 수 있다. 이러면 변경조건등이 필요할 때 메소드 안에 넣어줌으로써 손쉽게 수정할 수 있다.
Validation 어노테이션 vs Init
init {
if (this.title.isEmpty() || this.title.length > 200) {
throw TodoCardException("title must be at least 1 character and not more than 200 characters long")
}
if (this.content.isEmpty() || this.content.length > 1000) {
throw TodoCardException("content must be at least 1 character and not more than 1000 characters long")
}
}
나는 수정/삭제 Request 부분에 field 어노테이션으로 조건을 줬었다.
이 경우 동일한 조건을 여러 클래스에서 사용할 때 중복이 발생할 수 있다. (실제로 수정/삭제 request 에 똑같은 조건을 두번씩 적어줬다.)
init 블록으로 사용했을 경우 DB에 저장되기 전에 검증이 가능하다.
sql 도 조금씩 공부해야겠다. N + 1 얘기할 때 무슨 소린지 모르겠더라.!
다음주는 새 프로젝트기간인데 좀 무서우면서도 기대된다.
겁먹지 말고 편하게 생각하자 😫😫😫
'왕초보일지' 카테고리의 다른 글
240109 TIL | (2) | 2024.01.09 |
---|---|
240108 TIL | 7주차 팀프로젝트 (3) | 2024.01.08 |
240104 TIL | (2) | 2024.01.04 |
240103 TIL | step1피드백, step2정리, step3 (0) | 2024.01.03 |
240102 TIL | (0) | 2024.01.02 |