-
스프링 DB 데이터접근 기술 - 시작Spring-Boot/스프링 DB 2편 - 데이터 접근 기술 2022. 9. 1. 18:56
데이터 접근 기술 진행 방식 소개
* 적용 데이터 접근 기술 *
- JdbcTemplate
- MyBatis
- JPA, Hibernate
- 스프링 데이터 JPA
- Querydsl
* SQLMapper *
- JdbcTemplate
- MyBatis
* ORM 관련 기술 *
- JPA, Hibernate
- 스프링 데이터 JPA
- Querydsl
* SQL Mapper 주요 기능 *
- 개발자는 SQL만 작성하면 해당 SQL의 결과를 개체로 편리하게 매핑해준다.
- JDBC를 직접 사용할 때 발생하는 여러 중복을 제거해주고, 기타 개발자에게 여러가지 편리한 기능을 제공
* ORM 주요 기능 *
- JdbcTemplate 이나 MyBatis같은 SQL 매퍼 기술은 SQL을 개발자가 직접 작성해야 하지만, JPA를 사용하면 기본적인 SQL은 JPA가 대신 작성하고 처리한다.
- 개발자는 저장하고 싶은 객체를 마치 자바 컬레션에 저장하고 조회하듯이 사용하면 ORM 기술이 데이터베이스에 해당 객체를 저장하고 조회해준다.
- JPA 자바 진영의 ORM 표준이고, Hibernate(하이버네이트)는 JPA에서 가장 많이 사용되는 구현체이다
- 자바에서 ORM을 사용할 때는 JPA 인터페이스를 사용하고, 그 구현체로 하이버네이트를 사용
- 스프링 데이터 JPA, Querydsl은 JPA를 더 편리하게 사용할 수 있게 도와주는 프로젝트이다.
* DTO(data transfer object) *
- 데이터 전송 객체
- DTO는 기능은 없고 데이터를 전달만 하는 용도로 사용되는 객체를 뜻한다
ㆍ참고로 DTO에 기능이 있으면 안되는가?
그것은 아니다. 객체의 주 목적이 데이터를 전송하는 것이면 DTO라 할수있다.
- 객체 이름에 DTO를 꼭 붙여야 하는 것은 아니다. 대신 붙여두면 용도를 알 수 있다는 장점이 있다
* Optional : 값이 있을수도 있고 없을 수도 있다.
* @EventListener(ApplicationReadyEvent.class) : 스프링 컨테이너가 완전히 초기화를 다 끝내고, 실행 준비가 되었을 때 발생하는 이벤트이다. 스프링이 이 시점에 해당 애노테이션이 붙은 `initData()` 메서드를 호출해준다
- 참고로 이 기능 대신 `@PostConstruct`를 사용할 경우 AOP 같은 부분이 아직 다 처리되지 않은 시점에 호출될 수 있기 때문에, 간혹 문제가 발생할 수 있다.
- 예를 들어서 `@Transactional`과 관련된 AOP가 적용되지 않은 상태로 호출될 수 있다
- @EventListener(ApplicationReadyEvent.class) 는 AOP를 포함한 스프링 컨테이너가 완전히 초기화 된 이후에 호출되기 때문에 이런 문제가 생기지 않는다.
* @Profile("local") : 특정 프로필의 경우에만 해당 스프링 빈을 등록한다
- 여기서 `local`이라는 이름의 프로필이 사용되는 경우에만 `testDataInit`이라는 스프링 빈을 등록한다.
- 이 빈은 편의상 초기 데이터를 만들어서 저장하는 빈이다.
프로필
- 스프링은 로딩 시점에 `application.properties`의 `spring.profiles.active` 속성을 읽어서 프로필로 사용한다
- 이 프로필은 로컬, 운영환경, 테스트 실행 등등 다양한 환경에 따라서 다른 설정을 할 때 사용하는 정보이다
- 예를 들어서 로컬PC에서는 로컬PC에 설치된 데이터베이스에 접근해야 하고, 운영 환경에서는 운영 데이터베이스에 접근해야 한다면 서로 설정 정보가 달라야 한다.
- 심지어 환경에 따라서 다른 스프링 빈을 등록해야 할 수 도 있다.
- 프로필을 사용하면 이런 문제를 깔끔하게 해결할 수 있다
* main 프로필 *
- `/src/main/resources` 하위의 `application.properties`
// properties spring.profiles.active = local
- 이 위치는 `application.properties`는 '/src/main` 하위의 자바 객체를 실행할 때(주로 `main()`) 동작하는 스프링 설정이다
- `spring.profiles.active=local`이라고 하면 스프링은 `local`이라는 프로필로 동작한다
- 따라서 `@Profile("local")`가 동작
- `afterEach` : 테스트는 서로 영향을 주면 안된다. 따라서 각각의 테스트가 끝나고 저장한 데이터를 제거해야한다
ㆍ`@AfterEach`는 각각의 테스트의 실행이 끝나는 시점에 호출
* 테스트할 때는 기본적으로 인터페이스를 테스트하는게 좋다.
참고 - 권장하는 식별자 선택 전력
* 데이터베이스 기본 키는 다음 3가지 조건을 모두 만족해야 한다 *
1. `null` 값은 허용하지 않는다.
2. 유일해야 한다.
3. 변해선 안된다.
* 테이블의 기본 키를 선택하는 전략은 크게 2가지가 있다 *
1. 자연 키(natural key)
ㆍ비즈니스에 의미가 있는키
ㆍ예: 주민등록번호, 이메일, 전화번호
2. 대리 키(surrogate key)
ㆍ비즈니스와 관련 없는 임의로 만들어진 키, 대체 키로도 불린다
ㆍ예: 오라클 시퀀스, auto_increment, identity, 키생성 테이블 사용
* 자연 키보다는 대리 키를 권장한다 *
* 비즈니스 환경은 언젠가 변한다 *
'Spring-Boot > 스프링 DB 2편 - 데이터 접근 기술' 카테고리의 다른 글
스프링 DB 데이터접근 기술 - 스프링데이터 JPA (0) 2022.09.22 스프링 DB 데이터접근 기술 - JPA (0) 2022.09.22 스프링 DB 데이터접근 기술 - MyBatis (0) 2022.09.17 스프링 DB 데이터접근 기술 - 테스트 (0) 2022.09.14 스프링 DB 데이터접근 기술 - 스프링 JdbcTemplate (0) 2022.09.05