DataBase/Spring - DB

DataBase/Spring - DB

Spring DB 2 #9. 스프링 트랜잭션 이해 (2)

스프링 DB 2편 - 데이터 접근 활용 기술의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 스프링 AOP 주의 사항 - 초기화 시점 InitTest @PostConstruct 와 @Transactional 을 함께 사용하면 초기화 코드가 먼저 실행되고, 그 다음에 트랜잭션 AOP가 적용되기 때문에 초기화 시점에 아래 메소드에서는 트랜잭션이 적용되지 않는다. @PostConstruct @Transactional public void initV1() { boolean isActive = TransactionSynchronizationManager.isActualTransactionActive(); log.info("Hello init @PostConstr..

DataBase/Spring - DB

Spring DB 2 #9. 스프링 트랜잭션 이해 (1)

스프링 DB 2편 - 데이터 접근 활용 기술의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 스프링 트랜잭션 복습 Spring DB #4. 스프링과 문제 해결 - 트랜잭션 (1), Spring DB #4. 스프링과 문제 해결 - 트랜잭션 (2)에서 배웠던 내용들을 더 자세히 살펴보는 글 입니다. PlatformTransactionManager : 스프링이 제공하는 트랜잭션 추상화 인터페이스 TransactionTemplate : 템플릿 콜백 패턴을 지원하는 클래스. 정상적으로 동작하면 커밋을 해주고, 오류가 생기면 롤백을 시켜준다. @Transactional : 스프링이 제공하는 트랜잭션 AOP 어노테이션, 프록시를 사용해서 프록시가 트랜잭션을 대신 처..

DataBase/Spring - DB

Spring DB 2 #8. 데이터 접근 기술 - 활용

스프링 DB 2편 - 데이터 접근 활용 기술의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 스프링 데이터 JPA 예제 기존 예제들의 구조를 살펴보자. JpaItemRepository가 어댑터 역할을 해준 덕분에 ItemService가 사용하는 ItemRepository 인터페이스를 그대로 유지할 수 있고, 클라이언트인 ItemService의 코드를 변경하지 않도록 DI, OCP 원칙을 잘 지켜서 설계하였다. 그러나, 굳이 간단한 서비스에서는 구조를 맞추기 위해 DI와 OCP 원칙을 지킬 필요는 없다. 왜냐하면 구조를 지키기 위해서 중간에 어댑터가 들어가면서 전체 구조가 복잡해지고, 사용하는 클래스도 많아지기 때문이다. DI, OCP를 포기하면서 아래 ..

DataBase/Spring - DB

Spring DB 2 #7. 데이터 접근 기술 - QueryDSL

스프링 DB 2편 - 데이터 접근 활용 기술의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. QueryDSL QueryDSL은 정적 타입을 이용해서 SQL 등의 쿼리를 생성해주는 프레임워크이다. Spring Data JPA가 기본적으로 제공해주는 CRUD 메서드 및 쿼리 메서드 기능을 사용하더라도, 원하는 조건의 데이터를 수집하기 위해서는 필연적으로 JPQL을 작성하게 된다. 간단한 로직을 작성하는데 큰 문제는 없으나, 복잡한 로직의 경우 개행이 포함된 쿼리 문자열이 상당히 길어진다. JPQL 문자열에 오타 혹은 문법적인 오류가 존재하는 경우, 정적 쿼리라면 어플리케이션 로딩 시점에 이를 발견할 수 있으나 그 외는 런타임 시점에서 에러가 발생할 수도 있..

DataBase/Spring - DB

Spring DB #6. 예외 처리, 반복 해결

스프링 DB 1편 - 데이터 접근 핵심 원리의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 런타임 예외 적용 서비스 계층은 순수하게 비즈니스 로직만을 남겨야 한다. 서비스 계층은 SQLException을 처리할 수 없음으로 리포지토리가 던지는 SQLException 체크 예외를 [그림 1] 처럼 런타임 예외로 전환해서 서비스 계층으로 던지면 서비스 계층은 해당 예외를 무시할 수 있고, 특정 기술에 의존하는 부분을 제거할 수 있게 된다. import java.sql.SQLException; public interface MemberRepositoryEx { Member save(Member member) throws SQLException; Member..

DataBase/Spring - DB

Spring DB #5. 자바 예외

스프링 DB 1편 - 데이터 접근 핵심 원리의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 예외 계층 👉 자바 예외 처리에 대한 기본 개념은 Java #6. 예외 처리(Exception Handling)를 참고해주세요. Object : 모든 예외의 최상위 부모 Throwable : 모든 예외의 최상위 예외 Errors : 메모리 부족이나 심각한 시스템 오류와 같이 애플리케이션에서 복구가 불가능한 시스템 예외 Exception : 예외가 발생하더라도 애플리케이션에서 복구가 가능한 시스템 예외 Check Exception : 컴파일러가 확인해 줄 수 있는 예외 UnCheck Exception : 컴파일러가 확인해 주지 않는 예외 1.1 예외 기본 규칙 예..

DataBase/Spring - DB

Spring DB #4.스프링과 문제 해결 - 트랜잭션 (2)

스프링 DB 1편 - 데이터 접근 핵심 원리의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 트랜잭션 매니저 전체 동작 흐름 트랜잭션 매니저의 전체 동작 흐름은 다음과 같다. 먼저, 클라이언트의 요청으로 서비스 로직을 실행한다. 1. 서비스 계층에서 transactionManager.getTransaction() 을 호출해서 트랜잭션을 시작한다. 2. 트랜잭션을 시작하려면 먼저 DB 커넥션이 필요하기 때문에, 트랜잭션 매니저는 내부에서 데이터 소스를 사용해 커넥션을 생성한다. 3. con.setAutoCommit(false) 4. 커넥션을 트랜잭션 동기화 매니저에 보관한다. 5. 트랜잭션 동기화 매니저는 쓰레드 로컬에 커넥션을 보관한다. 따라서 멀티 쓰..

DataBase/Spring - DB

Spring DB #4. 스프링과 문제 해결 - 트랜잭션 (1)

스프링 DB 1편 - 데이터 접근 핵심 원리의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 문제점 1.1 애플리케이션 구조 대부분의 애플리케이션은 다음과 같이 프레젠테이션 계층(UI 처리, 웹 요청과 응답 등), 서비스 계층(비즈니스 로직), 데이터 접근 계층(실제 DB 접속 코드)등 3가지 계층으로 나누어져 있다. 특히, 서비스 계층은 가급적 비즈니스 로직만 구현하고 특정 구현 기술에 직접 의존해서는 안된다. 이렇게 하면 향후 구현 기술이 변경될 때 변경의 영향 범위를 최소화 할 수 있다. 👉 의존하는 것이 많을수록 기술이 변경 될 때 변경의 영향 범위가 넓어진다. 따라서 변경을 최소화 하기 위해 특정 기술에 의존하지 않는 것이 중요하다. 1.2 기..

DataBase/Spring - DB

Spring DB #3. 트랜잭션(Transaction) (2)

스프링 DB 1편 - 데이터 접근 핵심 원리의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 트랜잭션 적용 실제 애플리케이션에서 DB 트랜잭션을 사용해 계좌이체 같이 원자성이 중요한 비즈니스 로직을 어떻게 구현하는지 알아보자. 먼저 트랜잭션 없이 단순하게 계좌이체 비즈니스 로직만 구현해보자. 앞서 MemberRepositoryV1 에서 회원이 정상적으로 저장되는것을 확인 했다. MemberServiceV1 fromId와 toId의 회원을 조회해서 fromId에서 toId의 회원에게 money 만큼의 돈을 계좌이체하는 로직이다. @RequiredArgsConstructor public class MemberServiceV1 { private final M..

DataBase/Spring - DB

Spring DB #3. 트랜잭션(Transaction) (1)

스프링 DB 1편 - 데이터 접근 핵심 원리의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 트랜잭션 1.1 트랜잭션의 의미 트랜잭션(Transaction)은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 모두 수행되어야 할 일련의 연산들을 의미한다. 👉 상태를 변환시킨다는 것 : SQL 질의어를 통해 DB에 접근하는 것 - SELECT - INSERT - DELETE - UPDATE 👉 작업의 단위 : 많은 SQL 명령문들을 사람이 정하는 기준에 따라 정하는 것 EX) 사용자 A가 사용자 B에게 만원을 송금한다. -> 이 때 DB의 작업은 다음과 같이 이루어진다. 1. 사용자 A의 계좌에서 만원을 차감 ..

DataBase/Spring - DB

Spring DB #1. JDBC

스프링 DB 1편 - 데이터 접근 핵심 원리의 복습을 위한 글이며, 이 글에 나오는 모든 사진과 코드의 저작권은 김영한 강사님께 있습니다. 1. 프로젝트 생성 다음과 같이 프로젝트를 생성해준다. MySQL DB를 프로젝트에서 사용하기 위해서는 항상 MySQL DB를 실행시켜주어야 한다. 이 글을 참고해서 설치하였다. MySQL 명령어 - MySQL 서버 시작 : mysql.server start - MySQL DB 로그인 : mysql -uroot -p - MySQL DB 로그아웃 : exit 또는 quit - MySQL 서버 종료 : mysql.server stop 이후, DataGrip을 실행시켜 MySQL DB를 연결해준다. 이후 테스트에서 사용할 테이블을 만들고, 테이블이 출력되면 정상적으로 연결..

SeongJun Han
'DataBase/Spring - DB' 카테고리의 글 목록