Spring (26) 썸네일형 리스트형 Docker compose로 MongoDB 사용하기 (Mac) 현재 진행 중인 프로젝트에서 MongoDB를 사용하려고 했는데, 직접 설치하기보다는 docker compose를 사용해서 설치 없이 손쉽게 MongoDB 를 사용하려고 했습니다. 이를 위해 거쳤던 과정들을 정리하였습니다. 1. Mongo DB 사용을 위한 docker 설치 (2가지 방법)- 아래 명령어 실행하거나 docker desktop 에서 직접 설치brew install cask docker # docker 설치docker -v # docker 설치 확인 2. docker - compose 설치brew install cask docker-compose # docker compose 설치docker-compose -v # docker compose 버전 3. MongoDB docker compose .. 스프링 AOP 구현하기 - 1 (@Aspect, @Around, @Pointcut) 스프링 AOP를 구현하는 기본 코드입니다. 총 2개 포스팅으로 작성하였습니다.build.gradle스프링 AOP 기능을 구현하기 위해서 아래 dependency 들로 구성하였습니다.dependencies { implementation 'org.springframework.boot:spring-boot-starter' // Spring aop 사용을 위한 dependency implementation 'org.springframework.boot:spring-boot-starter-aop' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springfra.. 스프링 AOP 구현하기 - 2 (포인트컷 분리, @Order) https://silver-programmer.tistory.com/entry/%EC%8A%A4%ED%94%84%EB%A7%81-AOP-%EA%B5%AC%ED%98%84%ED%95%98%EA%B8%B0-1 위 포스팅에 이어서 작성하는 AOP 구현하기 2편입니다. 이번 포스팅에는 아래와 같은 내용을 정리하였습니다.포인트컷을 분리하여 외부에서 어떻게 참조할 수 있는지Advice 적용 순서를 어떻게 바꿀 수 있는지스프링 AOP 구현 - 3 (Pointcut 참조)포인트컷을 공용으로 사용하기 위해 별도의 외부 클래스에 모아둘 수 있습니다. 외부에서 호출할 때는 포인트컷의 접근 제어자를 public으로 설정합니다!package hello.aop.order.aop;import org.aspectj.lang.anno.. [DB] 스프링의 예외 변환기 스프링은 아래와 같이 데이터 접근과 관련한 예외를 추상화해서 제공해주고 있습니다. 예외의 최상위 예외는 org.springframework.dao.DataAccessException 입니다. 런타임 예외를 상속 받았기 때문에 스프링이 제공하는 데이터 접근 계층의 모든 예외는 런타임 예외입니다. DataAccessException 은 크게 NonTransient 예외와 Transient 예외로 구분할 수 있습니다.Transient : 일시적이라는 뜻으로 동일한 SQL을 다시 시도했을 때 성공할 가능성이 있습니다.예를 들어 쿼리 timeout, lock과 관련된 오류들입니다. 이런 오류들은 DB 상태가 좋아지거나 lock이 풀렸을 때 다시 시도하면 성공할 수 있습니다.NonTransient : 일시적이지 .. [DB] JDBC Template 사용하기 이전 포스팅 에서 사용한 Repository 클래스에는 코드가 복잡합니다. 특히나 JDBC를 사용하고 있는데 아래와 같이 동일한 코드가 반복되어 사용되고 있습니다.커넥션 조회 및 커넥션 동기화PreparedStatement 생성 및 파라미터 바인딩쿼리 실행결과 바인딩예외 발생시 스프링 예외 변환기 실행리소스 종료스프링은 이런 반복 문제를 해결하기 위해 JdbcTemplate 이라는 템플릿을 제공합니다. 이 템플릿을 사용하여 코드를 수정하면 아래와 같이 깔끔하게 작성할 수 있습니다.package hello.jdbc.repository.Account;import hello.jdbc.domain.Account;import lombok.AllArgsConstructor;import lombok.extern.sl.. [DB] @Transactional 이란? 해당 포스팅에서 트랜잭션 매니저를 이용해서 아래처럼 트랜잭션을 직접 시작할 수 있었습니다. public void transferMoney(String fromId, String toId, int money) { // 트랜잭션 시작 TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition()); try { // 비즈니스 로직 businessLogic(fromId, toId, money); transactionManager.commit(status); //성공시 커밋 } catch (E.. [DB] Spring 의 트랜잭션 추상화 (트랜잭션 매니저) 아래 코드는 서비스 클래스로, 트랜잭션을 사용하기 위해서 JDBC 기술에 의존하고 있습니다. 즉, JDBC에서 JPA 같은 다른 데이터 접근 기술로 변경하면 서비스 계층의 트랜잭션 관련 코드도 모두 함께 수정해야 하는 문제가 있습니다.package hello.jdbc.service;import hello.jdbc.domain.Account;import hello.jdbc.repository.Account.AccountRepository;import lombok.AllArgsConstructor;import lombok.extern.slf4j.Slf4j;// JDBC 기술에 의존import javax.sql.DataSource;import java.sql.Connection;import java.sql... [DB] 트랜잭션(Transaction) 이란? 데이터를 저장할 때 단순히 파일에 저장해도 되는데, 데이터베이스에 저장하는 이유는 여러 가지 이유가 있지만, 가장 대표적인 것은 바로 데이터베이스는 트랜잭션이라는 개념을 지원하기 때문입니다. 트랜잭션을 이름 그대로 번역하면 거래라는 뜻입니다. 즉, 데이터베이스에서 트랜잭션은 하나의 거래를 안전하게 처리하도록 보장해주는 것을 의미합니다. 예를 들어 A의 돈 10만원을 B에게 계좌이체 한다고 해 봅시다. 그럼 아래와 같이 동작해야 합니다. 1. A의 잔고를 10만원 감소2. B의 잔고를 10만원 증가 1번과 2번 작업은 하나의 작업처럼 동작해야 합니다. 만약 1번은 성공했는데 2번에서 문제가 발생하여 계좌이체에 실패하면 아주 큰 문제가 발생하겠죠. 데이터베이스의 트랜잭션 기능을 사용하면 1번과 2번이 둘 다.. 이전 1 2 3 4 다음