Spring Boot 책 정복하기

Spring Boot 책 정복하기

2021, Jul 12    

정리를 하게 된 이유.

Github에 프로젝트로 스터디를 진행을 하려고 했는데 Commit 메시지만으로 매번 스터디 시 궁금증을 해결했던 내용, 오류나 에러를 잡았던 기억을 확인하기가 힘들어서 남겨보기로 한다.

스터디 방법은 2명이서 번갈아가면서 실시간 진도 빼기 후 리뷰.

Part1 스프링부트 도전하기

01 프로젝트를 위한준비

이 부분은 함께 세팅했다. 한명은 Eclipse , Window / 한명은 intellij Mac 환경에서 진행

02 Maria 데이터베이스와 Spring Data JPA

각자 Maria DataDB를 각 피시에 세팅해서 소스코드만 공유하는 거로 진행하기로 하고, 데이터베이스 세팅은 각자하고 스터디 진행 시작.

Spring Data JPA를 사용해보고 이해해보는 시간을 가졌다.

JPA를 통해 관리하게 되는 객체를 위한 엔티티 클래스. 엔티티 객체들을 처리하는 기능을 가진 Repository.

스프링 내부에서 자동으로 객체를 생성하고 실행하는 구조라, 개발자 입장에서는 단순히 인터페이스를 하나 정의하는 작업만으로도 충분했다.

Spring Data JPA는 자동으로 생성되는 코드를 이용하므로, 단순한 CRUD나, 페이지 처리등의 개발에 코드를 개발하지 않아도 되는 장점이 있었다.

또한 쿼리 메서드를 활용해보면서 메서드의 이름 자체가 질의문이 된다는 새로운 세계를 경험 할 수 있었다.

findByMnoBetweenOrderByMnoDesc(Long from,Long to) 와 같은 메서드 명으로 구현 가능했다.

03 스프링 MVC와 Thymeleaf

책에서는 Thymeleaf 라는 웹환경과 비웹 환경 모두에서 작동할 수 있는 템플릿 엔진을 사용하는데 써보진 않았지만 JSP에서 서버에서 결과를 만들어 브라우저로 전송하며, JSP와 유사하게 ${}을 별도의 처리 없이 이용할 수 있고, Model에 담긴 객체를 화면에서 Javascript로 처리하기 편리하다는 것을 알았다. 개발도구 이용할 때 html 파일로 생성하는데 문제가 없고 별도의 확장자를 이용하지 않지만… 아직까지 쓰기에는 편하지는 않았다.

또한 날짜 형식을 변경해주기 위해 implementation group: ‘org.thymeleaf.extras’, name: ‘thymeleaf-extras-java8time’ 를 사용했는데 2.0.1 버전을 명시해서 사용하다보니 temporals.format을 사용할 수 없다는 것을 알게 되었다 한참 해메었는데, 버전이 낮아서 사용이 불가하다는 것을 알게 되었다. 스터디를 위함이니, 버전을 명시하지 않고 진행하기로 했다.

04 프로젝트 구조 만들기

이번 챕터에서는 프로젝트의 계층별 구조와 객체들의 구성, Querydsl을 이용해서 동적으로 검색 조건을 처리하는 방법, Entity 객체와 DTO의 구분, 화면에서의 페이징 처리를 해본다.

이번 장을 공부하면서 느낀점은 DTO 객체를 Entity객체로 변환하고, Entity객체를 DTO객체로 변화하는 과정이 필요했다. 앞에서는 변환한다고만 했지 왜 변환하는지에 대해 이유를 몰랐고, 더 불필요한 작업이 아닌가? 매번 객체를 변환해주고 다시 변환하는 과정을 해야하니깐? 이란 생각이 들었다 라이딩을 하면서 곰곰히 생각해봤는데 이전에는 xml에 정의하고 테이블에 직접 컬럼생성, Table 생성을 했지만, 해당 클래스의 인스턴스들이 JPA로 관리되는 엔티티 객체를 생성하면서 개발자 입장에서는 단순히 인터페이스를 하나 정의하는 작업으로 단순한 작업과 부탁을 하지 않아도 되니 코드가 많아지고 관리가 쉬워질 것 같다는 생각이 들었다.

이후 게시글의 작성, 수정, 삭제는 GET,POST 방식으로 개발을 했고 , GET 방식에서 경로와 화면의 파일 명이 일치하면 알아서 페이지로 랜딩을 해준다는 점…등등의 편리함을 느끼며 개발을을 해보기로 한다.

검색 처리를 해보면서 동적 쿼리를 만들기 위해 BooleanBuilder를 사용을 했다. BooleanBuilder는 where문에 들어가는 조건들을 넣어주는 컨테이너라고 생각하면 될 것 같다. 원하는 조건은 필드 값과 같이 결합해서 생성하며 BooleanBuilder 안에 들어가는 값은 com.querydsl.core.types.Predicate타입이어야 한다.

    Pageble pageable = PageRequest.of(0,10,Sort.by("gno").descending());
    
    QGuestbook qGuestbook = QGuestbook.guestbook;
    
    String keyword = "1";
    
    BooleanBuilder builder = new BooleanBuilder();
    
    BooleanExpressiong expression = qGuestbook.title.contains(keyworkd);
    
    builder.and(expression);
    
    Page<Guestbook> result = guestbookRepository.findAll(builder, pageable);
    
    result.stream().forEach(guestbook - > {
        System.out.println(guestbook);
    });
 

위에 BooleanBuilder 를 자주 사용안하면 까먹을 것 같아서 코드를 한번 적어보았다.