Programming 9

[SpringBoot] 공통 Response 포맷 적용하기

사이드 프로젝트를 진행하면서 어떻게 체계적으로 Request에 대한 Response 공통 포맷을 적용할 수 있을지 고민해봤다. 문제 해결을 위한 과정은 이러했다. 1. Success / Error 상황을 모두 담을 수 있는 하나의 공통 Response Class를 설계하자. 2. Controller에서는 Success / Error Info 를 담은 객체만을 리턴하자. 2-1. Success시 결과 클래스 생성 2-2. Exception 발생 시 에러 결과 클래스 생성 3. Controller의 return값을 AOP를 통해 공통 Response Class에 담아 책임을 분산하자. 4. Controller Unit Test를 통해 정상적으로 동작하는지 테스트 각 스텝별로 개발 내용을 조금 상세하게 정리해..

[SpringBoot] Enum타입을 DB에 변환 저장하는 법

Mybatis를 사용하여 DB에서 User정보를 가져오는 부분에서 다음과 같은 에러가 발생했다. org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'USER_ROLE' from result set.... User 클래스에 해당 사용자가 SELLER인지 ORDERER인지를 구분하는 USER_ROLE이라는 Enum을 사용하고 있는데, DB에서는 USER_ROLE을 INTEGER타입으로 저장하고 있기 때문에 값을 불러오는데에서 타입변환 문제가 발생한 것이다. - User class @AllArgsC..

[SpringBoot] Mybatis를 사용한 Service 테스트 코드 작성하기

id, password를 입력해서 login을 수행하는 service의 JUnit 단위 테스트 코드를 작성하였다. 여러 시행착오가 있었는데,, 문제를 해결하면서 찾아간 Mybatis가 쓰이는 테스트코드의 작성법을 정리해봤다. (JUnit5, Maven 기준) 1. MyBatis-Spring-Boot-Starter-Test 사용하기 MyBatis component를 사용하는 테스트코드를 작성하기 위해 아래 의존성을 pom.xml에 추가해준다. org.mybatis.spring.boot mybatis-spring-boot-starter-test 2.2.0 test 이제 @MybatisTest 어노테이션을 테스트 클래스에 사용하여 Mybatis Component(Mapper Interface, SqlSessi..

[SpringBoot] PetClinic 샘플 프로젝트 - 빌드 및 실행하기

좋은 코드를 많이 보아야 좋은 코드를 작성할 수 있을것 같아 스프링 공식 예제 프로젝트인 "PetClinic"을 내려받았다. 프로젝트의 시작은 세팅이 반에 가까울 정도로 중요하기에, 프로젝트 세팅과정을 정리해봤다. 0. 시작하기에 앞서 [프로젝트 환경] - framework: Spring Boot 2.5.5 - server: Apache Tomcat/9.0.53 [실습 환경] - os: Windows 10 - ide: IntelliJ - java: OpenJDK 17 1. git clone github에 올라온 프로젝트를 로컬에서 띄우기 위해 IntelliJ에서 clone을 해보자. IntelliJ의 get from VCS - Repository URL 메뉴에서 다음 주소와 저장할 directory를 입..

SQL Mapper와 ORM 차이

프로그램을 실행하는 동안 그 안에서는 많은 데이터들이 사용되고, 만들어진다. 우리는 이 데이터들이 프로그램이 종료되어도 사라지지 않고 어떤 곳에 저장되는 것이 필요한데, 이 개념이 바로 영속성(Persistence)이다. 이는 Layered Architecture에서 다음과 같이 도메인 모델과 데이터베이스 사이에 존재하며, 프로그램의 객체정보를 DB에 저장하고, DB의 정보를 객체로 담아와 사용할 수 있도록 한다. 자바에서는 데이터의 영속성(Persistence)를 위한 JDBC를 지원해주는데, 그림에서 보이는 프로세스와 같이 JDBC에서 DB에 접근하여 SQL을 수행하고, 결과값을 다시 dataType으로 매핑시켜주는 작업을 개발자가 일일히 수행해야 하는 번거로움이 있다. SQL Mapper와 ORM은..

Programming/JPA 2021.08.22

JPA로 CRUD 구현하기_(4)비즈니스 로직 수행

** 이전게시글 참고: 2021.08.20 - [Programming/JPA] - JPA로 CRUD 구현하기_(3)CRUD 구현 1. Service 구현 DB와 통신하며 데이터를 주고받는 CRUD 기능 구현이 끝났다. 이제 기능을 비즈니스 로직을 수행하는 MemberService 클래스를 구현해보자. [service/MemberService.java] package service; import repository.MemberRepository; import vo.Member; public class MemberService { private MemberRepository memberRepo; public MemberService(MemberRepository memberRepo) { this.member..

Programming/JPA 2021.08.20

JPA로 CRUD 구현하기_(3)CRUD 구현

** 이전게시글 참고: 2021.08.20 - [Programming/JPA] - JPA로 CRUD 구현하기_(2)객체와 테이블 매핑 1. CRUD 구현하기 실습에서는 JPA를 이용한 CRUD를 구현하지만, Mybatis나 다른 DB 접근방법으로 변경되어도 프로젝트의 상위계층(service)에는 영향이 없도록 하기 위해서 MemberRepository 인터페이스를 상속하는 JPA 구현 클래스를 생성한다. [repository/MemberRepository.java] package repository; import vo.Member; public interface MemberRepository { public void save(Member newMember); public Member findById(St..

Programming/JPA 2021.08.20

JPA로 CRUD 구현하기_(2)객체와 테이블 매핑

** 이전게시글 참고: 2021.08.20 - [Programming/JPA] - JPA로 CRUD 구현하기_(1)프로젝트 생성 1. Member 객체 매핑 JPA 사용을 위해서는 다음과 같이 자바 클래스와 회원 테이블을 매핑해야한다. [vo/Member.java] package vo; // JPA annotation을 사용하기 위한 라이브러리 import javax.persistence.*; // @Entity: DB Table과 매핑될 클래스임 // @Table: 매핑할 Table 정보 // @Id: 테이블의 기본키와 매핑할 필드 // @Column: 필드와 컬럼을 매핑 @Entity @Table (name="MEMBER") public class Member { @Id @Column(name = "..

Programming/JPA 2021.08.20

JPA로 CRUD 구현하기_(1)프로젝트 생성

자바의 ORM 기술표준인 JPA를 활용하여 간단한 CRUD 구현 프로젝트를 시작해보자. 여기서는 회원 추가(C), 회원 조회(R), 회원정보 수정(U), 회원 탈퇴(D) 4가지의 간단한 회원관리 기능만을 목표로 한다. [Environment] - IDE : IntelliJ - DB : H2 1.4.200 - Java : open-jdk 16.0.2 - JPA : Hibernate 5.5.6 (Aug 04, 2021) 1. 프로젝트 생성 먼저, IntelliJ에서 Maven 프로젝트를 생성한다. File - New - Project - Maven 선택 후 Next -> 프로젝트 Name, 파일 Location 설정 후 Finish 프로젝트 계층구조를 위해 다음과 같이 패키지를 생성한다. - service ..

Programming/JPA 2021.08.20