티스토리 뷰
spring boot REST API Web 프로젝트 (2) - h2 연동, SpringDataJPA 사용
구름뭉치 2021. 8. 3. 10:00스프링 부트 REST API WEB 프로젝트
깃헙 링크
https://github.com/choiwoonsik/springboot_RestApi_App_Project/tree/main/restApiSpringBootApp
수행 목록
- 환경구성 및 helloworld 출력
- H2 DB 연동
- Swagger API 문서 연동
- REST API 설계
- RestControllerAdvice를 이용한 통합 예외 처리
- Entity - DTO 분리
- MessageSource를 이용해 예외 메시지 다국화
- JPA Aduting을 이용해 객체 생성시간/수정시간 적용
- 스프링 시큐리티 + Jwt를 이용해서 인증 및 권한 체크
- 스프링 시큐리티 AuthenticationEntryPoint, AccessDenied로 인증 및 인가 예외처리
- Jwt AccessToken + RefreshToken으로 보안성과 사용자 편의성 고도화하기
- JUnit Test (단위 테스트)
- JUnit Test (통합 테스트)
- OAuth 2.0 정리
- OAuth 2.0 카카오 로그인 part.1 Authorization code + Token 발급
- OAuth 2.0 카카오 로그인 part.2 토큰으로 회원 가입 / 로그인
- OAuth 2.0 카카오 로그인 테스트 검증
- 환경별 설정을 위해서profile 분리하기
h2 DB연동
- https://www.h2database.com/html/main.html
- 다운을 받은 후 h2 -> bin -> h2.sh 실행. (chmod +x h2.sh 로 실행가능파일로 바꿔야한다.)
- jdbc:h2:~/(home) 을 기준으로 먼저 OOO.mv.dv파일을 만들어준다. (이름은 path에 적은 이름으로 적용된다)
- 이후 jdbc:h2:tcp://localhost/~/경로/(이름) 으로 접근하도록 변경해주면 된다.
application.yml 설정
spring:
freemarker:
template-loader-path: classpath:/templates
suffix: .ftl
datasource:
url: jdbc:h2:tcp://localhost/~/restApi
driver-class-name: org.h2.Driver
username: sa
jpa:
database-platform: org.hibernate.dialect.H2Dialect
properties:
hibernate.hbm2ddl.auto: create
show-sql: true
hibernate.hbm2ddl.auto 옵션이 create로 되어있는데 이는 애플리케이션이 켜질때 DB도 지우고 새로 만든다는 의미이다. none으로 설정시 아무것도 하지 않으므로 DB에 값이 유지된다.
추가 옵션
crate-drop : 시작할 때 db를 만드는 것은 동일하나, 종료시 삭제까지 한다.
update : 서버 시작시 Entity와 Table을 비교해서 변경된 내용을 감지한다. table이 없다면 생성해준다.
validata : 서버 시작시 Entity와 Table이 다르면 시작하지 않고 종료한다.
User Entity 생성
DB를 만들어보았으니 User 엔티티를 만들어보자.
User 엔티티
@Builder
@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Table(name = "user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long userId;
@Column(nullable = false, unique = true, length = 30)
private String email;
@Column(nullable = false, length = 100)
private String name;
}
@Builder
- 디자인 패턴 중 하나인 빌더패턴방식으로 객체를 생성할 수 있게해준다.
@Entity
- @Entity가 붙은 클래스는 JPA가 관리하는 클래스가 되고, 해당 클래스를 엔티티라고 한다.
- JPA를 사용해서 테이블과 매핑할 클래스는 반드시 @Entity를 붙여야 한다.
@Id
- primaryKey 임을 명시해준다.
@GeneratedValue
- pk값의 생성을 DB에게 위임한다.
@Table
- Entity를 JPA가 관리하도록 했고, 해당 엔티티를 테이블과 매핑하기 위해 테이블을 지정해주는 것이다.
- name은 테이블 명이 된다. (default : 엔티티명)
@Getter, Setter
- lombok을 사용해서 자동으로 get, set 메서드를 생성해준다.
@NoArgsConstructor, AllArgsConstructor, RequiredConstructor
- No : 인자가 없는 생성자를 만들어준다
- All : 필드의 모든값을 인자로 같는 생성자를 만들어준다
- Required : final로 선언된 값이 필수적인 것만 인자로 받는 생성자를 만들어 준다.
UserRepository + JpaRepository
DB에서 괸리해줄 User 엔티티도 만들었고 해당 엔티티를 담을 Table과 규칙도 정의했다.
이제 db에서 User를 CRUD(생성, 조회, 수정, 삭제)를 DB에서 하기위해 메서드를 만들어보자.
원래라면 UserRepository를 @Repositroy를 달아서 클래스를 만들고 사용되는 메서드 (findById, findByName, findAll, save 등) 를 인터페이스에 선언하고 이를 implements하여 오버라이드로 구현해 사용하는 전략이 일반적일 것이다.
하지만 JpaRepository라는 Spring Data Jpa를 사용하면 이러한 일반적으로 통용되는 DAO에 대한 CRUD 메서드를 전부 구현해 놨으므로 상속해서 바로 사용하면 된다.
사용방법
1. EntityRepository 인터페이스를 생성 후 JapRepository<Entitiy class 명, key TYPE>을 상속받는다.
- 이때, Entity 필드값으로 조회 메서드를 추가하고 싶다면 <반환타입> findBy{변수명} (<타입> 인자명) 을 선언만 해주면 알아서 JPA가 구현해 준다.
-
public interface UserJpaRepo extends JpaRepository<User, Long> { User findByName(String name); User findByEmail(String email); }
2. 바로 사용하면 된다.
저장 후 조회하는 Api를 테스트해보자. Junit으로 테스트는 추후 진행하겠다.
@PostMapping("/user")
public User save() {
User user = User.builder()
.email("dnstlr2933@naver.com")
.name("최운식")
.build();
return userJpaRepo.save(user);
}
@GetMapping("/findUser/{name}")
public User findUserByName(@PathVariable String name) {
return userJpaRepo.findByName(name);
}
정상적으로 작동되는 것을 확인할 수 있다.
'스프링 > 스프링부트 RestAPI 프로젝트' 카테고리의 다른 글
- Total
- Today
- Yesterday