스프링 DB - 데이터 접근기술

Heeeoh·2024년 3월 5일
0

스프링 DB

목록 보기
7/9
post-thumbnail

🌿 시작하기 앞서


스프링 부트 2.6.5 버전을 기준으로 작성됨
H2 데이터베이스 Version 2.2.224 (2023-09-17)


🌱 데이터 접근 기술


데이터 접근 기술

  • Jdbc Template
  • Mybatis
  • JPA, Hibernate
  • 스프링 데이터 JPA
  • Querydsl

SQLMapper

  • JdbcTemplate
  • MyBatis

ORM 관련 기술

  • JPA, Hibernate
  • 스프링 데이터 JPA
  • Querydsl

SQLMapper 주요기능

  • 개발자가 SQL만 작성 -> 결과를 객체로 편리하게 매핑해준다.
  • JDBC를 직접 사용할 때 발생하는 여러 중복을 제거, 기타 개발자에게 여러 편리한 기능을 제공

ORM 주요 기능

  • JPA는 기본적인 SQL은 JPA가 대신 작성 및 처리
  • 개발자가 저장하고 싶은 객체를 마치 자바 컬렉션에 저장하고 조회하듯이 사용하면 ORM 기술이 데이터베이스에 해당 객체를 저장 및 조회 해준다.
  • JPA는 자바 진영의 ORM 표준 , Hibernate(하이버네이트)는 JPA에서 가장 많이 사용하는 구현체
    • JPA 인터페이스 사용 , Hibernate 구현체로 사용
  • 스프링 데이터 JPA, Querydsl은 JPA를 더 편리하게 사용 가능하게 도와주는 프로젝트 (거의 필수)

데이터 접근 기술 진행 방식

  • 데이터 접근 기술에 대한 기본 이해와 전체 큰 그림을 그린다.
  • 각 기술들의 핵심 기능 위주로 학습
  • 각 기술들을 점진적으로 도입하는 과정을 통해서 각 기술의 특징과 장단점을 자연스럽게 이해

⚙️ 프로젝트 구조 및 설정


Repository 는 향후 다양한 데이터 접근 기술 구현체로 손쉽게 변경하기 위해 인터페이스 도입

public interface ItemRepository {
	Item save(Item item);
	void update(Long itemId, ItemUpdateDto updateParam);
	Optional<Item> findById(Long id);
	List<Item> findAll(ItemSearchCond cond);
}

검색, 수정

검색과 수정은 Dto 클래스를 각각 만들어서 처리
ItemSearchCond
ItemUpdateDto

// Dto 사용
 @Override
 public void update(Long itemId, ItemUpdateDto updateParam) {
 	Item findItem = findById(itemId).orElseThrow();
	findItem.setItemName(updateParam.getItemName());
 	//...
 }

DTO (Data Transfer Object)

  • 데이터 전송 객체
  • DTO는 기능은 없고 데이터를 전달만 하는 용도로 사용되는 객체
  • 객체 이름에 DTO를 꼭 붙일 필요는 없지만 붙여두면 용도를 알 수 있다는 장점이 있다.

확인용 초기 데이터 추가

@EventListener(ApplicationReadyEvent.class)
public void initData() {
	itemRepository.save(new Item("itemA", 10000, 10));
    // 추가할 데이터넣기 
}
  • 애플리케이션을 실행할 때 초기 데이터를 저장
  • @EventListener(ApplicationReadyEvent.class: 스프링 컨테이너가 완전히 초기화를 다 끝내고, 실행 준비가 되었을 때 발생하는 이벤트
    • 스프링이 이 시점에 해당 애노테이션이 붙은 initData() 메서드를 호출해준다.
    • @PostConstruct를 사용할 경우 AOP 같은 부분이 아직 다 처리되지 않은 시점에 호출될 수 있기에 간혹 문제 발생가능성이 있다. ex) @Transactional 과 관련된 AOP가 적용되지 않은 상태로 호출
    • @EventListener(ApplicationReadyEvent.class) 는 AOP를 포함한 스프링 컨테이너가 완전히 초기화 된 이후에 호출되기 때문에 이런 문제가 발생하지 않는다.

여러 설정

@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 : 설정파일로 MemoryConfig 클래스를 사용
  • @scanBasePackages : 컴포넌트 스캔 경로를 hello.itemservice.web 하위로 지정
  • @Profile : 특정 프로필의 경우에만 해당 스프링 빈을 등록
    • 여기서는 local이라는 이름의 프로필이 사용되는 경우에만 testDataInit 이라는 스프링 빈을 등록

프로필

스프링은 로딩 시점에 application.propertiesspring.profiles.active 속성을 읽어서 프로필을 사용

이 프로필은 로컬 (내 PC), 운영환경, 테스트 실행 등 다양한 환경에 따라 다른 설정을 할 때 사용하는 정보
프로필을 사용함으로써 현재 환경에 따른 설정을 할 수 있다!

main 프로필

/src/main/resource 하위의 application.properties

spring.properties.active=local
  • 이 위치의 application.properties/src/main 하위의 자바 객체를 실행할 때 (주로 main() ) 동작하는 스프링 설정

test 프로필

/src/test/resources 하위의 application.properties

spring.profiles.active=test
  • 이 위치의 application.properties/src/test 하위의 자바 객체를 실행할 때 동작하는 스프링 설정
  • 주로 테스트 케이스를 실행할 때 동작
  • 이 경우 local로 설정한 datainit는 빈에 등록되지 않는다.


✔️ 권장하는 식별자 선택 전략


데이터 베이스 기본 키는 다음 3가지 조건을 모두 만족해야 한다.

  1. null 값은 허용 x
  2. 유일해야 함
  3. 변해선 안 됨

테이블의 기본 키를 선택하는 전략 2가지

  • 자연 키 (natural key)
    • 비지니스에 의미가 있는 키
    • ex) 주민등록번호, 이메일, 전화번호
  • 대리 키 (surrogate key)
    • 비지니스와 관련 없는 임의로 만들어진 키, 대체 키로도 불린다.
    • ex) 오라클 시퀀스, auto_increment, identity, 키생성 테이블 사용

자연키 보다는 대리 키를 권장

이메일, 전화번호 등은 언제든 바뀔 수 있고 주민등록번호는 3가지 조건이 다 만족해보이는 것처럼 보이지만 현실과 비지니스 규칙은 생각보다 쉽게 변하며 주민등록 조차도 여러가지 이유로 변경될 수 있다.

비지니스 환경은 언젠가 변한다.


🔖 학습내용 출처

스프링 DB 2편 - 데이터 접근 활용 기술

profile
열심히 살자

0개의 댓글