본문 바로가기

프로그래밍/Spring

[SPRING] 회원 관리 예제 - 백엔드 개발

1,비즈니스 요구사항 정리

데이터: 회원ID, 이름

기능: 회원 등록, 조회

 

일반적인 웹 애플리케이션 계층 구조

컨트롤러: 웹 MVC의 컨트롤러 역할

서비스: 핵심 비즈니스 로직 구현

리포지토리: 데이터베이스에 접근, 도메인 객체를 DB에 저장하고 관리

도메인: 비즈니스 도메인 객체, 예)회원, 주문, 쿠폰 등등 주로 데이터베이스에 저장하고 관리됨

 

2.회원 도메인과 리포지토리 만들기

 

 


스프링 DB 접근 기술
1.H2 데이터베이스 설치
2.순수 Jdbc
3.스프링 통합 테스트
4.스프링 JdbcTemplate
5.JPA
6.스프링 데이터 JPA

 

2.순수 JDBC

build.gradle 파일에 jdbc, h2 데이터베이스 관련 라이브러리 추가

implementation 'org.springframework.boot:spring-boot-starter-jdbc'

(자바는 기본적으로 데이터베이스와 붙으려면 JDBC가 꼭 필요)

runtimeOnly 'com.h2database:h2'(DB와 붙을 때 데이터베이스가 제공하는 클라이언트가 필요)

 

스프링 부트 데이터베이스 연결 설정 추가

resources/application.properties

 

spring.datasource.url=jdbc:h2:tcp://localhost/~/test

spring.datasource.driver-class-name=org.h2.Driver

spring.datasource.username=sa

 

jdbc:h2:~/test

 

스프링을 쓰는 이유 

다형성을 활용할 수 있다(스프링 컨테이너가 굉장히 편리하게 되도록 지원)

 

개방-폐쇄 원칙(OCP, Open-Closed Principle)

 - 확장에는 열려있고, 수정, 변경에는 닫혀있다.

스프링의 DI (Dependencies Injection)을 사용하면 기존 코드를 전혀 손대지 않고, 설정만으로 구현 클래스를 변경할 수 있다.

회원을 등록하고 DB에 결과가 잘 입력되는지 확인하자.

데이터를 DB에 저장하므로 스프링 서버를 다시 실행해도 데이터가 안전하게 저장된다.

 

객체 지향의 장점

인터페이스에서 구현체를 바꾸면서도 기존코드를 변경하지 않고 바꿀 수 있는 것

 

3.스프링 통합 테스트

데이터베이스는 기본적으로 트랜잭션이란 개념이 있다. 

디비에 데이터를 insert한 후 commit을 해야 들어간다.

 

@SpringBootTest : 스프링 컨테이너와 테스트를 함께 실행한다.

@Transactional : 테스트 케이스에 이 애노테이션이 있으면, 테스트 시작 전에 트랜잭션을 시작하고, 테스트 완료 후에 항상 롤백한다. 이렇게 하면 DB에 데이터가 남지 않으므로 다음 테스트에 영향을 주지 않는다.

 

4.스프링 JdbcTemplate

순수 Jdbc와 동일한 환경설정을 하면 된다.

스프링 JdbcTemplate과 MyBatis 같은 라이브러리는 JDBC API에서 본 반복 코드를 대부분 제거해준다. 하지만 SQL은 직접 작성해야 한다.

 

생성자가 하나면 AutoWired 생략 가능

 

5.JPA

Jdbc-> JdbcTemplate 

반복적인 코드가 확 줄었다. 그러나 SQL은 개발자가 직접 작성을 해야한다.

 

JPA

SQL 쿼리도 JPA가 직접 작석을 해줘 개발 생산성을 크게 높일 수 있다.

마치 객체 메모리에 직접 집어 넣듯이 JPA에 넣으면 중간 부분을 직접 수행해준다.

SQL보다 객체 중심으로 고민할 수 있다.

 

PA는 기존의 반복 코드는 물론이고, 기본적인 SQL도 JPA가 직접 만들어서 실행해준다.
JPA를 사용하면, SQL과 데이터 중심의 설계에서 객체 중심의 설계로 패러다임을 전환을 할 수 있다.
JPA를 사용하면 개발 생산성을 크게 높일 수 있다.

 

//jpa, jdbc 다 포함
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
//jpa가 날리는 sql을 볼 수 있다.
spring.jpa.show-sql=ture

//jpa를 사용하면 객체를 보고 테이블을 만들지 말지 확인
spring.jpa.hibernate.ddl-auto=none //create

JPA를 쓰려면 엔티티를 매핑 해야 된다.

JPA라는 것은 간단히 말해서 인터페이스만 제공되는 것이고 hibernate, eclipse 등이 구현체이다.

JPA 자바진형의 표준 인터페이스고 구현은 여러 업체들이 하는 것이라 보면 된다.

JPA는 ORM(Object-Relational Mapping)이란 기술이다. 객체와 Relational  데이터베이스 테이블을 매핑하는 것이다.

EntityManager

 

JPA는 join들어 올때 모든 데이터 변경이 Tranctional안에서 실행 되야 된다.

 

6.스프링 데이터 JPA

스프링 부트와 JPA만 사용해도 개발 생산성이 정말 많이 증가하고, 개발해야할 코드도 확연히 줄어듭니다. 여기에 스프링 데이터 JPA를 사용하면, 기존의 한계를 넘어 마치 마법처럼, 리포지토리에 구현 클래스 없이 인터페이스 만으로 개발을 완료할 수 있습니다. 그리고 반복 개발해온 기본 CRUD 기능도 스프링 데이터 JPA가 모두 제공합니다.

스프링 부트와 JPA라는 기반 위에, 스프링 데이터 JPA라는 환상적인 프레임워크를 더하면 개발이 정말 즐거워집니다. 지금까지 조금이라도 단순하고 반복이라 생각했던 개발 코드들이 확연하게 줄어듭니다. 따라서 개발자는 핵심 비즈니스 로직을 개발하는데, 집중할 수 있습니다.

실무에서 관계형 데이터베이스를 사용한다면 스프링 데이터 JPA는 이제 선택이 아니라 필수 입니다.

 

> 주의: 스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술입니다. 따라서 JPA를 먼저 학습한 후에 스프링 데이터 JPA를 학습해야 합니다.

 

AOP

AOP: Aspect Oriented Programming

공통 관심 사항(cross-cutting concern) vs 핵심 관심 사항(core concern) 분리

 

동작방식

스프링은 Controller에서 Serivice 호출할 때 가짜 Service를 만들어서 가짜 Service(Proxy)가 끝나면 실제 Service가 돌아감