본문 바로가기

Spring|Spring-boot117

Spring-Data-JPA 소개 Spring Data 과거의 데이터베이스는 관계형 데이터베이스의 세상이었다. 현재 MongoDB, redis, Couchbase, neo4 j, hadoop 등 다양한 종류의 데이터베이스들이 우후죽순 생겨났다. 스프링 진영에서 이러한 다양한 데이터베이스를 이용해하는 작업 자체가 비슷하기 때문에 더 큰 레벨에서의 추상화를 하였다. Spring Data는 추상화를 통해 단순히 통합한 것보다 그 이상을 제공한다. CRUD + 쿼리 동일한 인터페이스 페이징 처리 메서드 이름으로 쿼리 생성 Spring Data JPA 순수 JDBC -> JdbcTemplate -> Mybatis -> JPA로 넘어가게 되면서 수많은 데이터 접근 기술의 발전을 이루었다. 이번에는 Spring Data JPA가 등장했다. 기존 JP.. 2022. 10. 20.
Spring Transaction Propagation 트랜잭션이 둘 이상인 경우 트랜잭션이 어떻게 동작하는지 알아보자. 여러 트랜잭션이 순차적으로 시작되고 종료되는 경우 @Test void sequenceTx() { TransactionStatus firstTx = txManager.getTransaction(new DefaultTransactionDefinition()); txManager.commit(firstTx); TransactionStatus secondTx = txManager.getTransaction(new DefaultTransactionDefinition()); txManager.commit(secondTx); } 테스트의 로그를 보면 생각한 순서대로 진행된다. 트랜잭션 시작함에 있어서 커넥션을 커넥션 풀에서 획득하고 커밋하고 커넥션을 .. 2022. 10. 16.
Spring Transaction Option 선언적 트랜잭션의 여러 옵션에 대해 간단히 알아보자. 1. value, transactionManager String value() default ""; String transactionManager() default ""; 트랜잭션을 사용하려면 스프링 컨테이너에서 어떤 트랜잭션 매니저를 사용할지 알아야 한다. 선언적 트랜잭션이 아닌 프로그래밍적으로 트랜잭션을 사용할 때 우리는 트랜잭션 매니저를 주입받아 사용했다. @Transactional을 사용할 때 별도의 트랜잭션 매니저를 지정하지 않았는데, 선언적 트랜잭션에서도 트랜잭션 매니저를 지정해주어야 한다. 다만 지정하지 않으면 기본으로 등록된 트랜잭션 매니저를 사용하기 때문에 대부분 생략한다. 다만 사용하는 트랜잭션 매니저가 둘 이상이라면 위 옵션을 사용.. 2022. 10. 15.
Spring DB (5) 요즘 트랜잭션이 필요한 비즈니스 로직에는 @Transactional 애노테이션이면 끝난다. 그럼 왜 @Transactional이라는 애노테이션으로 어떻게 진화되어 왔을까라는 의문이 든다. 데이터 접근 기술의 종속성을 걷어내기 위해 여러 가지 방법을 사용할 수 있다. 1. 트랜잭션 매니저를 사용하는 트랜잭션 템플릿 활용 비지니스비즈니스 로직에서 트랜잭션을 얻고 시작하여 try / catch문에 commit과 rollback이 존재하는 경우는 완전하게 비즈니스 로직에 대한 책임만을 가지고 있다고 보긴 힘들다. public void transactionEX(String fromId, String toId, int money) throws SQLException { TransactionStatus status .. 2022. 10. 14.
Spring AOP 한계(2) Spring은 프록시 기반의 AOP만을 지원하고 있다. 프록시 객체를 생성하는 방법은 크게 두 가지로 나뉜다. JDK 동적 프록시 CGLIB JDK 동적 프록시인 경우에는 인터페이스가 필수이며, 인터페이스 기반으로 프록시 객체를 생성한다. CGLIB는 구체 클래스를 기반으로 생성한다. 하지만 인터페이스가 있는 경우에는 JDK 동적프록시, CGLIB 둘 중 하나를 선택할 수 있다. 이는 spring 옵션 중 proxyTargetClass을 활용하여 선택할 수 있으며 false인 경우 JDK, true인 경우 CGLIB를 사용한다. 테스트 준비 Example은 구체 클래스 ExampleImpl은 ExampleInterface를 사용해 만든 구현체 ExampleInterface는 인터페이스이다. JDK 동적 .. 2022. 10. 14.
Spring DB(6) 이제 스프링에서 데이터 접근과 관련된 예외 추상화를 어떻게 하는지 알아보자. 데이터 접근 기술에 대한 예외를 직접 복구하고 싶은 경우 개별 데이터베이스마다 에러코드를 다루어서 처리해야 하는 고충이 존재했다. 언체크 예외를 통해 체크 예외를 감싸 커스텀 예외로 서비스 계층의 의존성을 낮추어도 실제 에러 코드를 식별해 적절한 언체크 예외를 처리하는 코드 블락이 문제가 발생한다. 이는 데이터베이스의 에러코드는 전부 다르고 이를 상수로 처리한다면 변경에 취약해지기 때문이다. 그렇기 때문에 스프링에서는 데이터 접근 기술과 관련된 예외를 추상화해서 제공한다. 스프링은 수십 가지의 예외를 정리해서 일관된 예외 계층을 제공한다. 따라서 개발자가 별도의 데이터 접근 예외를 굳이 만들 필요가 없다. 각각 예외는 모두 특정.. 2022. 9. 27.
Spring DB (4) 앞서 살펴본 내용의 주제는 트랜잭션의 개념이었다. 그럼 트랜잭션의 실제 사용한다고 했을 때 시작 시점과 종료 시점에 대해 알아보아야 한다. 시작 시점이라는 말은 살짝 애매모호하다. 해당 로직의 조회, 수정 등과 같은 실제 sql의 실행 시점을 표현하는 것이 아닌 애플리케이션 계층에서의 시작 시점으로 이해해야 한다. 보통인 경우 비즈니스 로직은 서비스 계층에 분리되어 있다. 우리는 트랜잭션의 시작 시점을 비즈니스 로직이 시작되는 서비스 계층에서부터 시작해야 한다. 그 이유는 비즈니스 로직에 관한 문제는 큰 위험성을 가지고 있어 문제가 발생하였을 경우 롤백을 통해 데이터 정합성을 맞춰야 하기 때문이다. 그럼 트랜잭션의 시작은 서비스 계층이다. 여기서 내가 몰랐던 부분은 "커넥션"이라는 문제이다. 애플리케이션.. 2022. 9. 19.
스프링 DB (3) 트랜잭션이라는 용어가 왜 사용되는지 알아보자. 트랜잭션은 데이터베이스에서 자주 사용되는 용어다. 이는 데이터베이스가 트랜잭션이라는 개념을 롤백과 커밋으로 지원할 수 있기 때문이다. 다만 이 용어가 애플리케이션단으로 옮겨져 자주 사용되기 때문에 혼란이 가중될 수 있기에 차근차근 이해해보자. 우선 트랜잭션은 특정한 행위들이 하나의 묶음으로 처리되도록 보장하는 장치이다. 예를 들어 모든 행위의 데이터베이스 작업이 전부 완료되어야만 정상적인 서비스가 가능한 서비스가 있다. 만약 이 서비스는 중간에 특정 행위에서 오류가 발생한다면 어떻게 해야 할까? 이 경우에는 모든 것은 전부 되돌림으로 써 처음부터 없었던 행위로 처리해야 문제가 발생하지 않는다. 또한 이러한 트랜잭션의 행위는 데이터베이스의 제약 조건을 항상 만.. 2022. 9. 5.
스프링 DB (2) 간단히 이론을 보고 머릿속으로 상상하고 사용하는 것과 이해하는 것에 많은 차이가 있는 부분이 커넥션이라고 생각한다. 커넥션 관리라는 것이 생각보다 쉽지 않은 과정이고 앱과 데이터베이스의 연결로 인해 발생하는 오류가 생각보다 많이 발생하기 때문이다. 이에 대해 앱과 데이터베이스 간의 상호작용, 각 의미를 기억한다면 추후 분명하게 도움이 될 거라 생각한다. 커넥션 풀 우선 왜 커넥션 풀(Connection Pool)이 필요한지 알아야 한다. 우리는 한정된 자원 안에서 동작하는 앱을 만든다. 무한한 자원이란 없다. 그중 애플리케이션은 데이터베이스와 수많은 상호작용을 해야 한다. 왜냐하면 모든 데이터가 데이터베이스에 있기 때문이다. 커넥션은 말 그대로 애플리케이션과 데이터베이스가 소통하기 위한 연결 통로를 의미.. 2022. 8. 15.
스프링 DB (1) 오랫동안 기다리던 김영한님의 스프링 DB 강의가 열렸다. 이론과 실전까지 기다려 한번에 구매했다. 이번 강의로 내가 확실히 알고 있는 것과 두리뭉실하게 알고 있던 것을 확실히 구분하는 좋은 기회가 됐으면 한다. 다시 복습한다는 느낌으로 이론 공부를 시작해보자. 내가 공부를 헛하지 않았다면 빠르게 이해해야 한다. 과거의 데이터베이스는 서로 많은 차이점을 가지고 있다. 만약 애플리케이션 서버가 A라는 데이터베이스와 연결할 때와 B라는 데이터베이스와 연결할 때 차이점이 존재하기 때문에 변경이 일어나면 그 영향이 애플리케이션 코드 영역까지 침범한다. 따라서 추상화를 통해 데이터베이스 벤더사에 영향을 받지 않고 하나의 표준으로 데이터베이스를 이용하기 위해 만든 자바 API이다. 즉 자바 진영에서는 데이터베이스를 .. 2022. 8. 15.