실무를 하다가 한가지 작업에 여러개의 트랜잭션이 필요한 상황이 있다.예를 들어보겠다. 현재 배치 파일을 만드는 상황이다. 배치 파일을 만들기 위해서는 파일 내부도 만들어야하고, 파일 서버에 업로드도 해야하고, 배치 파일이 insert 되었다는 기록도 해야한다.큰 틀에서 보면 3가지 작업이 있다. 한번의 작업을 하는데 적어도 3개의 메소드가 필요하다. 그렇다면 @Transactional 어노테이션은 어디에 걸어두는게 적절할까? 라는 고민을 하였다. 아래 코드는 최상위의 코드이다. @Slf4j@Servicepublic class DailyTransactionService { private final TransactionBatchService transactionBatchService; public..
Spring 프레임워크를 사용하면 대부분의 클래스들에 어노테이션을 선언하고는 한다 대표적으로 많이 사용하는 어노테이션이 Lombok, Spring Context 에 Bean 으로 등록하기 위한 어노테이션이 있다 @Getter, @Setter, @Service, @Component, @RestController 등... 개발을 하며 여러가지 어노테이션을 사용하고 있을 것이라고 생각한다 그리고 위 어노테이션을 선언함으로써 어떠한 동작을 할수있게 된다. 나는 문득 궁금해졌다.내가 이 어노테이션이 어떻게 동작하는지 알고 쓰는걸까?어노테이션을 내가 만들어서 사용할 수 있을까?라는 생각을 하였다. 위 생각을 행동으로 옮기기 위해 생각이 났을 때 공부를 해보고 기록을 해보았다 1) 어노테이션 동작 원리 및 예시어..
들어가며나는 jsch 라이브러리를 사용하여 파일을 SFTP 를 통하여 다른 서버로 전송을 해야했다.ex) prod-server -> file-server 필자는 gradle 을 사용하여 아래 의존성을 추가하여 라이브러리를 사용하였다.implementation group: 'com.jcraft', name: 'jsch', version: '0.1.55' 간단하게 내 상황에 대하여 설명을 해보자면프론트에서 User 가 파일 업로드를 여러개 하였고 그 파일들을 서버로 전송 받아서위 파일들을 SFTP 세션을 생성해 파일 서버로 보내는 작업을 하고 있었다. 위 상황에서 추가적인 요구사항이 들어왔다.User 가 파일업로드 후 서버로 파일들을 전송할 때, User 가 업로드 한 파일이 아닌다른 서버에 존재하는 파일..
들어가며평소 통합 테스트 위주로 작성을하였고, 복잡한 비즈니스를 매번 엔드포인트 단위로 테스트를 하는것에 지쳐단위 테스트를 연습하여 점점 확장되는 복잡한 비즈니스에도 사소한 에러를 발생시키지 않게 하기 위해 공부를 해보았다. [UnitTest]단위 테스트는 개발 초기 단계에서 버그를 발견하고 수정하는데 도움을 준다.단위 테스트는 코드의 리팩토링 과정에서 중요하다.기존의 테스트 케이스를 통해 리팩토링 후 기능이 올바르게 동작하는지 체크할 수 있기 때문이다. 단위 테스트는 Repository -> Service -> Controller 순으로 테스트를 할 것이다 말 그대로 단위 테스트는 단위(=Unit) 별로 테스트를 하는 것이다.즉 1개의 메소드를 작성하면 그 메소드가 올바르게 동작하는지 확인하는 테..
들어가며 미니 프로젝트를 진행하며 원하는 기능에서 api 퍼포먼스(=성능) 가 생각했던 것 보다 나오지 않았다.-> Chrome 개발자도구 네트워크 탭의 통해 load 를 통해 api 응답이 몇초만에 왔는지 확인할 수 있었다. 그래서 위 api 성능을 더 잘내기 위해 어디서 시간초를 많이 소요하는지 체크를 해보고 싶었다.그래서 방법을 찾던 중에 Aop 를 사용하여 간단하게 로깅을 할 수 있다는 것을 알았다. 그래서 나중에 혹시또 사용할 수도 있으니 사용했던 방법을 기록해보려고 한다. build.gradle 추가 implementation 'org.springframework.boot:spring-boot-starter-aop' application.yml 로깅 추가logging: level: ..
들어가며Spring 어플리케이션을 사용해 무언가를 만들다보면 트랜잭션을 당연하게 사용한다.추가적으로 여러 사람에 코드를 보면 @Transactional 어노테이션이 붙어있는 코드를 보고는 한다. 나 또한 무의식 속에 @Transactional 을 서비스 계층에 있는 비즈니스 로직에 붙이고는 한다.대충 알기로 트랜잭션, 즉 CUD 작업이 일어나는 곳에 붙이면 된다. 정도만 알고 있었고 어떠한 역할을 하고, 왜 붙여야 하는지는 제대로 알지 못했다.이번 공부를 통해 확실하게 알아본 내용을 적어보려고 한다. 본론데이터를 관리할 때 가장 중요하게 여기는 점은 정확한 데이터를 유지하는 것이다 우리는 특정 실행 시나리오가 잘못되거나 일관되지 못한 데이터로 끝나 버리기를 원치 않는다.위 시나리오가 위배될 경우 당..
들어가며토이 프로젝트에서 JWT 랑 Spring Security 를 사용하여 로그인을 구현하는 기능을 만들고 있던 중여러 인증,인가 관련된 여러 에러 를 만나게 되었습니다. 위 기능을 잘 사용하기 위해서는 Security 기본은 알아야 더 잘 구현할 수 있겠다는 생각이 들어기초적인 내용을 공부를 해본 후 중요한 내용만 포스팅을 하려고 합니다. 들어가기 전에 앞서 Spring Security 의 동작 구조에 대해서 간단하게 설명을 하며,Spring Security 가 어느 부분에서 개입을 하는지, 어떤 역할을 하는지를 위주로 알아보겠습니다. 보통 Java, Spring 개발자들이 security 를 사용하는 이유는 여러 이유가 있겠지만,저는 JWT토큰 로그인을 기능을 알아보면서 자연스럽게 spring-se..
서론 매번 스프링 설정을 할 때 까먹는 것 같아 정리를 해둠.위 어노테이션은 jakarta.annotation API에 이미 작성이 되어있으므로 우리는 가져다가 사용만 하면된다. 자세한 내용 및 내부구현은 레퍼런스 문서를 보면 알 수 있다. 본론 @PostConstruct 는 서버가 실행될 때 빈으로 등록되 있는 인스턴스를 스프링 컨텍스트에 올려 초기화를 진행할 때, 위 어노테이션이 붙어 있는 메소드를 호출한다. 그리고 메소드에 등록되 있는 어떠한 작업을 실행한다.@Componentpublic class DBClear { @Autowired private UserRepository userRepository; @PostConstruct private void postConstruc..