SPARTA 과제/SPRING

숙련) 일정관리앱 트러블슈팅 (2)

kjw81024 2026. 2. 11. 23:09

문제1

중복된 이메일이 생성은 되는데 이후에 로그인 하려고 하니까 NonUniqueResultException 예외가 뜸 

 

해결과정

@Column(unique = true)

email 은 로그인할때 고유하게 사용되어야하는 값이기 때문에 unique 로 만들어줬습니다. 

이제 중복된 이메일이 등록되진 않는데 500 error 가 발생하고 뭐때문에 발생했는지 알 수 없음...

400 + 중복된 이메일입니다 를 출력해주고싶어요

-> 새로 exception 만들어주기 

 

결론

나이 등 일상생활에서 중복을 허용하는 필드를 제외하곤 unique 를 달아주도록 하자!


문제2

댓글 전체조회와 일정 단건을 조회하면 모든 댓글이 출력되어야하는데 처음 넣은 댓글 하나만 출력된다.

 

해결과정

Comment 는 Schedule ID 를 갖고있는게 아니라 schedule 을 갖고있었음

근데 나는 아래처럼 commentList 를 받아오고 있었다....

List<Comment> commentList = commentRepository.findAllById(schedule.getId());

근데 또 어이없었던건... 하나만 조회되던가 아예 조회 안되어야하는거 아닌가? 

-> 아님!!!!

 

findAllById 메서드는 엔티티의 PK 를 기준으로 조회하는 메서드

-> findAllById 는 댓글의 id 가 schedule.getId() 인 댓글을 찾는 의미이다....

즉 내가 찾던건 comment.id == schedule.id 인 댓글이었기때문에 schedule.id 가 1이면 첫번째 댓글만 조회되는 것이었다.. 바보!

List<Comment> commentList = commentRepository.findAllBySchedule(schedule);

아래처럼 고쳐주니 정상적으로 동작한다.

 

결론

findAllById 는 엔티티의 PK 를 기준으로 조회

JPA repository 가 자동으로 만들어주는 메서드를 사용할때는 주의하기 


문제3

password encoding 을 하려고 하니까 크기가 6에서 20 사이어야한다는 오류메시지가 출력됨 

ConstraintViolationException

 

해결과정

기준이 DB 에 저장되는 기준인듯하다. 

column 의 사이즈 어노테이션을 entity 가 아니라 request 로 옮겨주어 저장해야할것같다.

 

수정해주니까 정상적으로 동작한다. 

해시를 사용해서 암호화하면 얼마나 pw 가 길어지는지 궁금해서 print 해서 확인해봤더니 

\wow

a 가 이렇게나 많은데 중복되는 부분이 없어서 뭐지? 했는데 hash 는 원래 복호화가 안 되는 단방향 암호화 라고 한다 신기

 

결론

작성한 코드는 암호화 -> DB에 저장 순서로 이루어짐 

Entity 에 어노테이션으로 길이를 지정해주는건 DB에 저장할때 확인하므로 DB 입장에선 이미 암호화 된 pw 인 엄청 긴... 해시값을 받게 되므로 오류가 발생함

 

request DTO 에서 입력값을 검증하고 넘겨야함 


문제4

작성하면서 생각났는데 그럼 엔티티에 어노테이션으로 체크를 해줘야하는지 DTO 에 어노테이션으로 체크를 해줘야하는지 모르겠다... 입력값은 DTO 에서 확인을 먼저 하고 request 로 보내는 게 맞는거같기도 하고 NotBlank 같은건 NOT NULL 로 ERD 에도 적어줬던 거 같아서 더 헷갈림

 

해결과정

일단 방금 문제를 해결하며 입력값 검증은 DTO 에 붙이는게 맞는 것 같음

잘못된 입력이 들어오면 사용자 잘못이니까 DB 까지 안보내고 바로 오류메시지를 @Valid 를 사용해서 출력해줄 수 있으니까...

 

Entity 에는 다른거 붙이지말고 아래 코드정도만 붙여주는 게 좋을듯 하다

@Column(nullable = false, length = 255)

 

수정지옥에 빠짐 - _ -

 

Schedule DTO

이상하게 이건 entity 와  request 에 똑같은 어노테이션 (@Size(max = 30) 같은거...) 를 다 넣어뒀다

불안했나보다... entity 만 수정해줌!

 

Comment DTO

여긴 아예 request DTO 에 어노테이션이 없길래 새로 만들어줬다

댓글은 생성과 삭제밖에 안 돼서 DTO 가 하나! 넘 좋다

 

User DTO

login 할 때는 일부러 email 과 pw 의 입력값 검증을 넣어주지 않았다 (@NotBlank 만 넣음)

어차피 틀리면 로그인이 안 되는거니까...

회원가입, 수정 할때는 @NotBlank @Size @Pattern 을 꼼꼼히 넣어줬다

 

엔티티 제약조건은 이후에 ERD 에 꼼꼼히 그려넣어보도록

 

결론

어노테이션도 잘 구분해서 붙여주자~

DTO  Entity
@Size
@Max
@Min
@NotBlank
@Pattern
. . .
@Column
@Id
@GeneratedValue
@ManyToOne
@JoinColumn
. . .