들어가며평소 통합 테스트 위주로 작성을하였고, 복잡한 비즈니스를 매번 엔드포인트 단위로 테스트를 하는것에 지쳐단위 테스트를 연습하여 점점 확장되는 복잡한 비즈니스에도 사소한 에러를 발생시키지 않게 하기 위해 공부를 해보았다. [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 작업이 일어나는 곳에 붙이면 된다. 정도만 알고 있었고 어떠한 역할을 하고, 왜 붙여야 하는지는 제대로 알지 못했다.이번 공부를 통해 확실하게 알아본 내용을 적어보려고 한다. 본론데이터를 관리할 때 가장 중요하게 여기는 점은 정확한 데이터를 유지하는 것이다 우리는 특정 실행 시나리오가 잘못되거나 일관되지 못한 데이터로 끝나 버리기를 원치 않는다 예시를 보자 1) 내 계좌에서 ..
들어가며토이 프로젝트에서 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..
들어가며오늘은 SpringBoot 환경에서 RabbitMQ 를 사용해서 비동기 이벤트 처리를 해보겠습니다. 참고로 오늘은 이벤트 발행자 와 수신자 딱 두가지 기능을 구현해볼 예정입니다. 메시지를 보내는 발행자 : Producer(=issuer)메시지를 받는 수신자 : Recevier(=consumer) 위 두가지 기능 구현을 위주로 이야기를 해보겠습니다. 서론비동기 처리를 알아보기 전에 간단한 개념설명을 해보겠습니다. RabbitMQ 는 무엇일까요?AMQP 를 구현한 오픈소스 메세지 브로커 이다.위 라이브러리를 사용하는 이유는 비동기 작업이 필요할 때 즉 많은 작업이 요청되어 처리를 해야 할 때 사용합니다. ❓그럼 AMQP 는 무엇일까요Advanced Message Queueing Protocol의 ..
안녕하세요 오늘은 스프링 시큐리티 Config 설정 중에서 만난 오류에 대해서 알아보려고 합니다. csrf()' is deprecated since version 6.1 and marked for removal 위 오류는 Spring Security 에서 config 설정을 할 때 일어난 오류 입니다. 기존에 csrf 방어는 디폴트로 활성화가 되어 있지만, 공부를 하는 입장에서는 비활성화 상태로 하기 위해서코드를 작성하다가 오류가 생겼습니다. Deprecated 는 이제 과거 코드이고, 지원하지 않는다고 하여 Spring Security 문서를 보니 함수형으로 바꿔서 쓰라고 친절하게 예시 코드가 보여 주었습니다. 스프링6.0 이 출시되면서 스프링부트 또한 3.x 버전으로 업그레이드가 되었습니다.스프링6...
들어가며오늘은 프로젝트에서 로그 메시지에 대한 내용을 수정하기 위한 작업을 해볼 예정입니다. 로그 메세지를 왜 수정해야 할까요? 이미 스프링부트 환경에서는 자동으로 로그메세지도 제공해주고,Error 면 Error, Info 면 Info 알아서 나오지 않나요? 라는 생각을 할 수 있습니다. 하지만 로그도 하나의 코드라는 생각으로 스프링에서 제공해주는 일반적인 로그가 아닌내가 알아보기 편한, 즉 가독성(=읽기 편한) 로그를 만들어주는 것 또한 중요하다고 생각합니다. 실질적으로 서비스를 운영하면, 다양한 환경에서 Error 및 Info 로그를 체크해야 할 일이 많습니다. 그 로그들을 편리함,가독성, 팀원 과 공통적인 설정, 여러가지 보안적인 부분 프로젝트 스펙을 클라이언트와 맞추기 위해서 로그 스펙을 설정..