WEB/Spring
[Spring JPA] IncorrectResultSizeDataAccessException
IncorrectResultSizeDataAccessException 제가 JPA 레포지토리에서 findBy~~ 메서드를 통해 단일 select를 하면서 발생한 예외입니다. 원하는 조건의 데이터는 단일 데이터인데, db에 해당 조건의 데이터가 여러개가 존재하며 모든 데이터가 가져와지면서 예외가 발생했습니다. 팀원 중 한 명이 서비스의 시나리오와는 별개로 데이터를 추가하면서 발생한 문제로, 서비스의 시나리오대로 로직이 구동될 경우 발생하지 않았습니다. Reference https://computer-science-student.tistory.com/496 [스프링, Spring] JDBC queryForObject의 결과가 없을 때(null) 혹은 결과가 2개 이상일 때 - IncorrectResultSi..
[Spring Boot] API Docs를 자동으로 만들어보자!
많은 분들이 그렇겠지만 저는 지금까지 FE 팀원들과 소통하기 위해서 Notion에 API Docs를 만들어서 사용했습니다. 이렇게 만들면 귀찮아서 하기 싫고... 코드에 수정이 발생하면 이것도 수정해야하고... 오타 검수도 힘들고.... 너무 불편해서 찾아봤더니 Swagger라는 툴을 주로 사용한다고 해서 저도! 사용해보고자 합니다. ㅎㅎ 왜 Swagger? 다른 문서화 도구도 있지만 Swagger는 특히 적용하기 쉽습니다! 정말 몇 줄의 코드만으로 만들 수 있어요! 그리고 테스트를 할 수 있는 UI를 제공해줘서 Swagger 문서 화면에서 API를 바로 테스트할 수도 있습니다! 저는 지금까지 Postman을 사용해서 API를 테스트했는데, Postman에서 API를 문서화하면... Notion이랑 다를..
[SpringBoot] SpringBoot에 MongoDB 연결
만들어둔 MongoDB 데이터베이스를 SpringBoot 프로젝트에 연결해보려고 합니다. 목표 데이터베이스에 이름과 나이를 저장하고 확인하는 테스트 코드를 작성해 봅시다. 데이터베이스 이름 : test 컬렉션 이름 : Info 의존성 추가 implementation ("org.springframework.boot:spring-boot-starter-data-mongodb") 연결 설정 저는 MongoDB Altas로 데이터베이스를 생성해서 해당 URI를 가져와 설정해 주었습니다. Overview에서 본인의 클러스터의 Connect를 클릭합니다. 여기서 Drivers를 선택해 줍니다. 3번에 있는 윗줄을 복사해 주시고 다음과 같이 맞춰줍니다. spring.data.mongodb.uri=mongodb+srv..
[Spring Boot] JPA - MySQL
Mybatis vs JPA MySQL 데이터베이스를 연결하는 방법으로 두 가지 중 어떤 방법을 선택할지 고민했습니다. Mybatis는 직접 쿼리를 작성한 후 XML 또는 어노테이션을 사용해서 데이터 맵핑을 하는 방법이고, JPA는 객체와 관계형 데이터베이스 간의 매핑을 제공해주어서 쿼리를 작성할 필요가 없습니다. Mybatis를 사용해봤던 경험으로 저는 Mybatis를 사용하면서 장기간 프로젝트를 이어나가면 코드가 조금 복잡할 수 있겠다 생각했습니다. (물론 제가 실력이 부족해서..ㅎㅎ) JPA를 사용할 경우 얻을 수 있는 장점으로 여러 가지가 있겠지만 저는 밑에 있는 이유 때문에 JPA를 선택했습니다. - 코드를 더욱 간결하게 만들 수 있습니다. - 보다 높은 유연성과 확장성을 제공합니다. 아직 JPA..
[Spring Boot] TDD - JUnit?
JUnitJUnit은 Java의 표준 단위 테스트 프레임워크 입니다.JUnit은 어노테이션을 기반으로 테스트를 지원합니다.JUnit 5는 크게 Jupiter, Platform, Vintage 모듈로 구성됩니다. JUnit LifeCycle AnnotationJUnit은 아래와 같은 테스트 라이프 사이클을 가지고 있습니다.@Test - 테스트용 메소드를 표현하는 어노테이션@BeforeEach - 각 테스트 메소드가 시작되기 전에 실행되어야 하는 메소드를 표현@AfterEach - 각 테스트 메소드가 시작된 후 실행되어야 하는 메소드를 표현@BeforeAll - 테스트 시작 전에 실행되어야 하는 메소드를 표현 (static 처리 필요)@AfterAll - 테스트 종료 후에 실행되어야 하는 ..
[Spring Boot] Spring Boot에서 TDD 방법론
이전에 스프링을 사용하여 개발을 진행했을 때는 테스트를 거의 하지 않았습니다.딱히 필요하다고 느끼지 못했습니다.하지만 많은 팀에서 채택하는 것을 보고TDD 방법론과 조금은 친해지면서 새롭게 시작할 프로젝트에는 적용해서 개발해보고 싶어졌습니다. TDD?먼저 TDD란??Test Driven Development, 테스트 주도 개발입니다.말 그대로 테스트 코드를 먼저 작성하고 테스트를 통과하기 위해 개발을 이어가는 방법입니다. Why TDD?그렇다면 TDD를 채택하는 이유는 무엇일까요?TDD의 장점은 다음과 같습니다.객체 지향적인 코드 개발, 설계 수정시간의 단축, 유지보수(리팩터링)의 용이성, 테스트 문서의 대체 가능 저는 이중에서 객체 지향적인 코드 개발, 유지보수의 용이성, 테스트 문서의 대체 가능이 세..
[Spring] 패키지 구조
고민 전에 프로젝트를 진행하면서 패키지를 어떤 기준으로 나누어 만들어야 효율적인지 고민을 했다. 처음에는 컨트롤러, 서비스, 레포지토리 등으로 나누었고 다음은 조금 더 간결하고 모아지도록 M,V,C 각각 패키지로 만들었다. 하지만 프로젝트 크기가 커지면서 도메인마다의 MVC가 생겨났다. 그러면서 어떻게 해야 찾기에도 편하면서 관리하기 좋을까? 고민을 하던 당시에는 가장 좋은 효율을 찾던 중 맡은 기능별로 나누어 관리했다. 지금와서 생각해보면 결론적으로 도메인을 기준으로 나누어 진행했었다. 종류 패키지를 구조적으로 계층형과 도메인형으로 나뉜다. 계층형 구조 처음 내가 진행했던 방법은 계층형 구조이다. 계층형 구조는 작은 프로젝트에 유용하며 전체적인 구조를 빠르게 파악할 수 있다. 하지만 하나의 디렉토리에 ..
[Spring Boot] Spring boot EC2에 배포하기
Java JAVA JDK, JRE 설치 및 환경설정 AWS EC2 AWS EC2 에 스프링 부트를 배포하자. 먼저 저자는 Maven 사용했기 때문에 package 를 더블클릭해서 실행하면 배포를 하게되고 아래 콘솔에 나온 경로로 이동해서 server-0.0.1-SNAPSHOT.jar 파일을 찾는다. 이 파일이 배포 파일이다. (설정에 따라 war 일 수도 있음) EC2로 해당 파일을 옮긴 후 java -jar server-0.0.1-SNAPSHOT.jar 를 입력하여 실행하면 스프링 부트가 실행된다. 이 실행을 백그라운드로 돌리기 위해서는 nohup java -jar server-0.0.1-SNAPSHOT.jar & 이렇게 입력해준다. 만약 스프링을 배포한다면 톰캣을 설치하고 webapps 폴더 내에 해..