TIL

278일차(모험 187일차) - 댓글 기능 추가(+ test코드 작성)

haedal-uni 2022. 6. 20. 20:57
728x90

댓글 기능 추가하기 (css 미완)

 

 

 

 

Test (2개 작성)

- db 저장 test

- Registry id가 1인 댓글 모두 가져오는지 test

 

Error

댓글 값을 모두 가져오기 위해서 test 코드를 작성했는데 아래와 같이 에러가 떴다.

query did not return a unique result: 2

값을 하나만 불러오는데 n개를 불러와서 그런 것 같아 List 형태로 변경했다.

 

* 아래처럼 작성했다가 변경함

Optional<User> findByUsername(String username);

⬇️

List<Comment> findAllByRegistryId(int idx);

 

*Optional

더보기

 

NPE(NullPointerException) 이란?

개발을 할 때 가장 많이 발생하는 예외 중 하나가 바로 NPE(NullPointerException)이다. 

 

NPE를 피하려면 null 여부를 검사해야 하는데, 

null 검사를 해야하는 변수가 많은 경우 코드가 복잡해지고 번거롭다. 

그래서 null 대신 초기값을 사용하길 권장하기도 한다.

List<String> names = getNames();
names.sort(); // names가 null이라면 NPE가 발생함

List<String> names = getNames();
// NPE를 방지하기 위해 null 검사를 해야함
if(names != null){
    names.sort();
}

 

 

Optional이란?

Java8에서는 Optional<T> 클래스를 사용해 NPE를 방지할 수 있도록 도와준다. 

Optional<T>는 null이 올 수 있는 값을 감싸는 Wrapper 클래스로, 

참조하더라도 NPE가 발생하지 않도록 도와준다. 

 

Optional 클래스는 아래와 같은 value에 값을 저장하기 때문에 값이 null이더라도 

바로 NPE가 발생하지 않으며, 클래스이기 때문에 각종 메소드를 제공해준다.

 

출처 : [Java] Optional이란? Optional 개념 및 사용법 - (1/2)

 

 

 

 

 

index 0 out of bounds for length 0  에러

test 단위로 각자 실행하면 에러가 뜨지 않았는데 이전까지 작성한 test 모두 한번에 실행시키면 에러가 떴다. Registry id가 1인 댓글 모두 가져오는지 test 하는 곳에서 에러가 출력되어서 하나씩 출력시키면서 확인을 했고 원인을 알 수 있었다.

 

코드를 먼저 설명하자면 게시물을 등록하는 Registry와 댓글을 등록하는 Comment가 있다.

여기서 Comment의 들어가는 칼럼 중에는 Registry의 id값과 nickname이 들어간다. 그래서 id가 1인 댓글들을 모두 가져오기 위해서 repository에 담을 파라미터 id 값을 registry의 id 값으로 넣어뒀는데 출력을 시켜보니 6으로 뜬 것이다.

registry.setMain("1");
int idx = Math.toIntExact(saveRegistry.getIdx()); // long을 int로 형변환
List<Comment> results = commentRepository.findAllByRegistryId(idx);
System.out.println("idx : " + idx); // 6으로 출력됨

 

 

test할 data를 id가 1인 comment를 2개 등록했기 때문에 2 이상부터는 데이터가 없어서 에러가 뜬 것이었다.

 

 

 

기존 데이터 혹은 test 코드가 한번에 실행되면서 겹쳐진 값이 있는 것 같아 이전에 h2를 이용해서 test 코드를 작성했었다.

@DisplayName("H2를 이용한 Comment TEST")
@TestPropertySource(locations = "/application.properties")

이전에 h2에서 mysql로 db를 변경하면서 test 코드를 실행시키면 id값이 auto_increment이기 때문에 id가 1, 2 가 있는 상태에서 test를 2번 실행 후 실제 db를 넣으면 3번이 아닌 5번으로 실행되어서 test 코드 중 일부는 h2로 변경했었다.

 

| Auto increment가 적용되는 id 값은 rollback 되지 않는다.

| Auto increment 값은 transaction에 포함되지 않기 때문에 내부적으로 id값이 증가한다.

 

* 참고

2022.05.15 - [WIL] - 35주차

2022.05.26 - [TIL] - 253일차(모험 162일차) - test 코드 작성해보기

 

* [add] comment test 코드 작성 [#73] #74

 

 

 

MySql

mysql에 comment table을 생성하는데 아래와 같이 에러가 떴다.

Incorrect column specifier for column 'comment_id'.

→ auto_increment 는 필드 타입이 숫자형에만 해당된다. (Long으로 입력했었다.)

따라서 int로 변경하여 테이블을 생성했다.

출처 : auto_increment 설정이 안되요;;

 

 

 

Back

findAllByRegistryId()를 이용해서 id가 x인 값의 댓글들을 모두 가져온다.

 

 

 

front

게시물 상세보기 클릭 시 get 방식으로 db를 가져온다.  findComment(idx)

<button onclick="allRegistry(${idx}); findComment(${idx})">

* 클릭 시 2개 이상의 이벤트를 할 경우 " ;  "으로 구분한다. 

 

 

<button id="commentBtn" class="btn" type="submit" onclick="Comment()">등록하기</button>

댓글 input 창에 값을 입력하고 버튼 클릭 시 db가 저장되는 post 방식이 사용된다. Comment()

성공할 경우 input 창에 있던 값을 댓글 창에 추가로 띄워준다.

 

728x90