데이터 접근 기술
데이터 접근 기술 방식
- 데이터 접근 기술 종류
- JdbcTemplate
- MyBatis
- JPA, Hibernate
- 스프링 데이터 JPA
- Querydsl
- JdbcTemplate, MyBatis는 SQLMapper 방식이고
JPA, Hibernate, 스프링 데이터 JPA, Querydsl은 ORM 관련 기술 방식이다.
- SQL Mapper : 개발자가 SQL만 작성하면 해당 SQL의 결과를 객체로 편리하게 매핑해준다.
- JDBC를 직접 사용할 때 발생하는 여러 중복을 제거하고 편리한 기능을 제공해준다.
- ORM 기술 : JPA를 사용하면 기본적인 SQL을 대신 작성하고 처리해준다.
- 저장하고 싶은 객체를 자바 컬렉션처럼 저장하고 조회하듯 사용하면 개발자 대신 DB에 해당 객체를 저장하고 조회해준다.
- JPA는 자바의 ORM 표준이며 Hibernate는 JPA에서 가장 많이 사용하는 구현체이다.
- 스프링 데이터 JPA, Querydsl은 JPA를 더 편리하게 사용할 수 있도록 도와주는 프로젝트로 실무에서 JPA 사용 시 꼭 함께 사용하는 것이 좋다.
프로젝트 구조
- MVC 1편에서 만든 예제를 활용할 것
- DTO(Data Transfer Object) : 데이터 전송 객체
- DTO는 기능은 없고 데이터를 전달하는 용도로 사용되는 객체이다.
- DTO에 기능이 있어도 되지만 주 목적이 데이터를 전송하는 것이어야 한다.
- 객체 이름에 DTO를 붙임으로 용도를 명확히 하기 위한 것이지 필수는 아니다.
- DTO는 기능은 없고 데이터를 전달하는 용도로 사용되는 객체이다.
- Repository는 구현 기술이 변경될 수 있기에 인터페이스로 구현하는 경우가 많지만 Service는 특정 기술에 종속되지 않고 핵심 비지니스 로직을 담고 있기에 인터페이스로 구현하는 경우가 많지 않다.
@Slf4j
@RequiredArgsConstructor
public class TestDataInit {
private final ItemRepository itemRepository;
@EventListener(ApplicationReadyEvent.class)
public void initData() {
log.info("test data init");
itemRepository.save(new Item("itemA", 10000, 10));
itemRepository.save(new Item("itemB", 20000, 20));
}
}
- 애플리케이션 실행 시 초기 데이터를 저장하기 위한 예제 코드
- @EventListener(ApplicationReadyEvent.class) : 스프링 컨테이너가 완전히 초기화를 다 끝내고 실행 준비가 되었을 때 발생하는 이벤트이다.
- 이 시점에 initData() 메소드를 호출한다.
- @EventListener() 대신 @PostConstruct를 사용하는 경우 AOP 같은 부분이 아직 다 처리되지 않은 시점에 호출될 수 있기 때문에 문제가 발생할 수 있다.
- @EventListener(ApplicationReadyEvent.class) : 스프링 컨테이너가 완전히 초기화를 다 끝내고 실행 준비가 되었을 때 발생하는 이벤트이다.
@Import(MemoryConfig.class)
@SpringBootApplication(scanBasePackages = "hello.itemservice.web")
public class ItemServiceApplication {
public static void main(String[] args) {
SpringApplication.run(ItemServiceApplication.class, args);
}
@Bean
@Profile("local")
public TestDataInit testDataInit(ItemRepository itemRepository) {
return new TestDataInit(itemRepository);
}
}
- 스프링 애플리케이션 클래스 코드
- @Import : @Configuration으로 설정한 파일을 두개 이상 사용하는 경우 설정 파일을 등록하는 어노테이션이다.
- @Profile을 사용함으로 특정 프로필의 경우에만 해당 스프링 빈을 등록하도록 했다.
- 프로필(Profile) : 로컬, 운영 환경, 테스트 실행 등등 다양한 환경에 따라 다른 설정을 할 때 사용하는 정보이다.
- 스프링은 로딩 시점에 application.properties의 spring.profiles.active 속성을 읽어서 프로필로 사용한다.
- /src/main/resources의 application.properties에 프로필을 지정하면 스프링은 해당 프로필로 동작한다.
- /src/test/resources의 application.properties에 프로필을 지정하면 테스트 케이스 실행 시 해당 프로필로 동작한다.
- ex) 로컬과 운영 환경에서 사용하는 DB가 다른 경우, 환경에 따라 다른 스프링 빈을 등록하는 경우
- 프로필을 지정하지 않으면 default 프로필이 실행된다.
데이터베이스 테이블
- 권장하는 식별자 선택 전략
- 데이터베이스 기본 키는 다음 3가지 조건을 모두 만족해야 한다.
- null 값은 허용하지 않는다.
- 유일해야 한다.
- 변해선 안된다.
- 테이블의 기본 키를 선택하는 전략은 크게 2가지 있다.
- 자연 키 (natural key) : 비지니스에 의미가 있는 키
- ex) 주민등록번호, 이메일, 전화번호
- 대리 키, 대체 키 (surrogate key) : 비지니스와 관련 없는 임의로 만들어진 키
- ex) 오라클 시퀀스, auto_increment, identity, 키생성 테이블 사용
- 자연 키 (natural key) : 비지니스에 의미가 있는 키
- 자연 키보다는 대리 키를 권장한다.
- 자연 키는 유일할 수 있지만 변경될 수도 있다.
- 데이터베이스 기본 키는 다음 3가지 조건을 모두 만족해야 한다.
- 기본적으로 대리 키를 기본 키로 사용하되 주민등록번호나 이메일처럼 자연 키의 후보가 되는 컬럼들은 필요에 따라 유니크 인덱스를 설정해서 사용하는 것을 권장한다.
정리
- SQL Mapper : 개발자가 SQL만 작성하면 해당 SQL의 결과를 객체로 편리하게 매핑해준다.
- ex) MyBatis, JdbcTemplate
- ORM 기술 : JPA를 사용하면 기본적인 SQL을 대신 작성하고 처리해준다.
- 저장하고 싶은 객체를 자바 컬렉션처럼 저장하고 조회하듯 사용하면 개발자 대신 DB에 해당 객체를 저장하고 조회해준다.
- ex) Hibernate, 스프링 데이터 JPA ...
- DTO(Data Transfer Object) : 데이터 전송 객체
- DTO는 기능은 없고 데이터를 전달하는 용도로 사용되는 객체이다.
- 프로필(Profile) : 로컬, 운영 환경, 테스트 실행 등등 다양한 환경에 따라 다른 설정을 할 때 사용하는 정보이다.
- ex) 로컬 환경과 운영 환경에서 사용하는 DB가 다른 경우
- 식별자 선택 시 기본적으로 대리 키를 기본 키로 사용하되 주민등록번호나 이메일처럼 자연 키의 후보가 되는 컬럼들은 필요에 따라 유니크 인덱스를 설정해서 사용하는 것을 권장한다.
출처 : [인프런 김영한 스프링 DB 2편 - 데이터 접근 활용 기술]
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-2/dashboard
스프링 DB 2편 - 데이터 접근 활용 기술 강의 | 김영한 - 인프런
김영한 | 백엔드 개발에 필요한 DB 데이터 접근 기술을 활용하고, 완성할 수 있습니다. 스프링 DB 접근 기술의 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 백엔드
www.inflearn.com
'Spring > [인프런 김영한 스프링 DB 2편 - 데이터 접근 활용 기술]' 카테고리의 다른 글
[인프런 김영한 스프링 DB 2편 - 데이터 접근 활용 기술] 데이터 접근 기술 - 스프링 데이터 JPA (0) | 2024.11.26 |
---|---|
[인프런 김영한 스프링 DB 2편 - 데이터 접근 활용 기술] 데이터 접근 기술 - JPA (1) | 2024.11.23 |
[인프런 김영한 스프링 DB 2편 - 데이터 접근 활용 기술] 데이터 접근 기술 - MyBatis (1) | 2024.11.21 |
[인프런 김영한 스프링 DB 2편 - 데이터 접근 활용 기술] 데이터 접근 기술 - 테스트 (1) | 2024.11.21 |
[인프런 김영한 스프링 DB 2편 - 데이터 접근 활용 기술] 데이터 접근 기술 - 스프링 JdbcTemplate (1) | 2024.11.21 |