spring boot31 [JUnit5] 테스트 인스턴스 @DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class) class StudyTest { int value = 1; @FastTest @Test @DisplayName("스터디 만들기 ╯°□°)╯ fast") void create_new_study() { System.out.println(value++); Study actual = new Study(10); assertEquals(actual.getLimit(), 10); assertThat(actual.getLimit()).isGreaterThan(0); } @SlowTest @DisplayName("스터디 만들기 \uD83D\uDe31 slow") @Test void create_n.. Spring Boot/JUnit5 2022. 7. 22. [JUnit 5] Tag, CustomTag 테스트 그룹을 만들고 원하는 테스트 그룹만 테스트를 실행할 수 있는 기능.입니다. @Tag 테스트 메소드에 태그를 추가할 수 있다. 하나의 테스트 메소드에 여러 태그를 사용할 수 있다. 인텔리J에서 특정 태그로 테스트 필터링 하는 방법 Edit Configurations 를 눌러줍니다. 그 후의 +를 눌러 JUnit을 눌러서 JUnit을 추가해줍니다. 그 후의 Name 을 정해준후 Tags를 fast 를 적어서 @Tag가 fast 메소드들만 실행되게 해줍니다. @Test @DisplayName("스터디 만들기 ╯°□°)╯ fast") @Tag("fast") void create_new_study() { Study actual = new Study(10); assertEquals(actual.getLimi.. 카테고리 없음 2022. 7. 21. [JUnit5] Assumptions Assumptions Assumption 구문은 테스트 메서드가 특정한 조건에 대해서 실행하고자 할 때 사용하는 구문입니다. JUnit5에서는 org.junit.jupiter.api.assumptions 패키지의 내용물로 사용할 수 있습니다. assumeTrue 메서드는 파라미터의 값이 true일때 테스트를 계속 진행하겠다라는 의미입니다. 예를들어 특정한 OS, JAVA 버전, 환경변수에 따라 이러한 값에 따라 실행되어야한다. 실행되지 않아야 한다. 이런식으로 활용 할 수 있습니다. 저는 환경변수를 통해 테스트를 진행하였습니다. 이런식으로 환경변수를 하나 잡아줍니다. 그리고 인텔리제이를 껏다켜야합니다. 인텔리제이는 기본적으로 실행당시에 환경변수들을 읽어오기때문에 재부팅하지 않으면 인식하지 못할 수 도 있.. Spring Boot/JUnit5 2022. 7. 21. [JUnit5] Assertion assertEquals study public class Study { private StudyStatus studyStatus = StudyStatus.DRAFT; private int limit; public StudyStatus getStatus() { return this.studyStatus; } } StudyTest class StudyTest { @Test @DisplayName("스터디 만들기 ╯°□°)╯") void create_new_study() { Study study = new Study(-10); assertNotNull(study); //기대 값 왼쪽 나오는 값 오른 쪽이긴하나 상관없다. assertEquals(StudyStatus.DRAFT, study.getStatus(),.. Spring Boot/JUnit5 2022. 7. 21. [JUnit 5] JUit5 테스트 코드 테스트 코드의 중요성 개발단계 초기의 문제 발견을 도와줍니다. 개발자가 나중에 코드를 리팩터링 하거나, 기존 기능을 업그레이드하는 과정에 올바르게 작동하는지 확인할 수 있습니다. 기능의 불확실성을 감소할 수 있습니다. 시스템에 대한 실제 문서를 제공합니다. 즉, 단위 테스트 자체가 문서로 사용할 수 있습니다. 테스트 코드 적용 후 느낀 첫 번째 : 빠른 피드백 및 자동 검증 기존의 개발 방식은 다음과 같았다고 합니다. 코드 작성 서버(Tomcat, 내장 서버) 실행 API 테스트 도구(Postman)로 HTTP 요청 및 응답을 눈으로 확인 결과가 다르면 서버 중지 후 코드 수정 여기서 매번 코드를 수정할 때마다 2번~4번을 반복했다고 합니다. (이건 저도 똑같네요ㅎㅎ) 따라서, 매번 서버를 .. Spring Boot/JUnit5 2022. 7. 21. [Project] 게시글 페이징 처리 구현, 정렬 및 테스트 게시글 리스트를 보여주는 과정에서, 개수가 많아지는 경우 모든 게시글 데이터를 한번에 뿌려주는 것보다 페이지별로 나눠서 보여주는 것이 깔끔하고 데이터 절약에 좋기 때문에 게시글 리스트 페이징 처리를 구현해보려 한다. 현재 프로젝트에서는 검색 부분과 함께 페이징 처리가 되야한다는점을 생각하며 만들어 보려고 한다. 이전 글에 비즈니스로직을 설계하면서 repository와 service까지 페이징 처리를 하기 위해 다 만들어놨습니다. 이제 이것을 뷰와 컨트롤러에 적용만하면 됩니다. 현재 게시판상태입니다. 밑의 페이지버튼은 눌러도 아무런 반응이 없습니다. 이 상태에서 이번 페이지가 예를들어서 3페이지이고, 전체 페이지바의 크기가 5개이다 가정하면 previous 12345 next 이런식으로 구현을 하려고 합니.. Project/project-board 2022. 7. 14. [Project] 게시글, 댓글 비즈니스 로직, 페이지 구현 지금까지 Entity, API, QueryDsl, DTO 까지 구현을 했습니다. 이제 이에 맞게 게시판, 댓글 컨트롤러, 뷰, 서비스클래스를 만들어 테스트까지 해보도록하겠습니다. ArticleController RequiredArgsConstructor @RequestMapping("/articles") @Controller public class ArticleController { private final ArticleService articleService; @GetMapping public String articles(@RequestParam(required = false) SearchType searchType, @RequestParam(required = false) String searchVa.. Project/project-board 2022. 7. 14. [Project] DTO 설계 이번글은 DTO설계를 해보겠습니다. DTO가 무엇인지 알아보고 설계를 해보도록하겠습니다. DTO란? Data Transfer Object의 약자로, 계층간 데이터 교환을 위한 자바빈즈를 뜻한다. 여기서 말하는 계층은 컨트롤러, 뷰, 비즈니스 계층, 퍼시스턴스 계층을 말하며 각 계층간 데이터 교환을 위한 객체를 DTO또는 VO라고 부릅니다. DTO는 VO(Value Object)와 용어를 혼용해서 많이 사용하는데, VO는 읽기만 가능한 read only 속성을 가져 DTO와의 차이점이 존재한다. - DTO는 로직을 가지지 않는 데이터 객체이고 getter/setter메소드만 가진 클래스를 의미한다. - DTO(Data Transfer Object)는 데이터 전송(이동) 객체라는 의미를 가지고 있다. - 계.. Project/project-board 2022. 7. 14. [Project] QueryDSL 적용 저번 글에 API 설계까지 하였습니다. 하지만 기본적인 API는 Srping Data Rest가 자동으로 생성해줬지만 검색 기능은 구현해주지 않습니다. 지금부터 이 검색 기능을 QueryDSL을 사용하여 구현해보도록 하겠습니다. QueryDSL @Query("select a from Article a where a.id = :id") Article findByID(@Param("id") Long id); Spring Data JPA가 기본적으로 제공해주는 CRUD 메서드 및 쿼리 메서드 기능을 사용하더라도, 원하는 조건의 데이터를 수집하기 위해서는 필연적으로 JPQL을 작성하게 됩니다. 간단한 로직을 작성하는데 큰 문제는 없으나, 복잡한 로직의 경우 개행이 포함된 쿼리 문자열이 상당히 길어집니다. JPQ.. Project/project-board 2022. 7. 11. [Project] API 설계 이번에는 API 설계를 할 차례입니다. 프로젝트 명세서에서 API 엔드포인트를 미리 정해놨습니다. 아직 프로젝트 규모가 크지 않기 때문에 spring에서 제공하는 Srping Data Rest + Spring Data JPA를 이용하여 REST API를 손쉽게 만들어보겠습니다. 그리고 이것을 쉽게 확인할 수 있는 spring-data-rest-hal-explorer를 같이 사용하겠습니다. 먼저 보편적으로, REST API 생성 시 구조는 아래와 같을 것입니다. (Controller -> Service -> Repository) - Controller @RestController @RequiredArgsConstuctor public class ArticleController { private final .. Project/project-board 2022. 7. 11. [DB] 인덱스란? 인덱스란? 데이터베이스에서 인덱스는 특정 칼럼 값에 대한 목차입니다. 책을 보면 맨 앞에 목차를 두어 빠르게 찾아갈 수 있게 하도록 도와주는데 이와 비슷한 개념이 INDEX입니다. 테이블의 검색 속도는 데이터가 적으면 상관없지만 10만 개 100만 개 1억 개 점점 데이터가 방대해질수록 속도가 떨어지게 됩니다. 이때 미리 데이터들에 목차가 되는 형태의 index를 설정해두면 검색 속도를 향상할 수 있습니다. 예를 들어 사용자가 무수히 많은 티스토리에서 블로그 제목이 'abc;라는 블로그를 찾고자 한다면 다음과 같은 이 쿼리를 짜야할 것입니다. SELECT title FROM tistory WHERE title = 'abc'; 인덱스가 없다면 예를 들어 티스토리의 글 개수가 100만 개라면 데이터를 모두 .. DB 2022. 7. 9. [Project] 도메인 설계 및 DB 접근 로직 DB설계 시부터 테이블명을 단수로 할 것인지 복수로 할 것인지 고민하다가 통일성 있게 한다면 문제가 되지 않는다는 글을 보고 저는 단수로 만들기로 하였습니다. (관련 내용은 여기를 눌러주세요.) 의존성 주입과 DB 설계했던 것과 동일하게 엔티티 클래스를 만들어 줍니다. build.gradle implementation 'org.springframework.boot:spring-boot-starter-data-jpa' application.yml spring: datasource: url: jdbc:mysql://localhost:3307/board username: jisu password: 1234 driver-class-name: com.mysql.cj.jdbc.Driver mysql 기본 포트는 3.. Project/project-board 2022. 7. 9. 이전 1 2 3 다음