들어가며 미니 프로젝트를 진행하며 원하는 기능에서 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) 내 계좌에서 ..
서론 매번 스프링 설정을 할 때 까먹는 것 같아 정리를 해둠.위 어노테이션은 jakarta.annotation API에 이미 작성이 되어있으므로 우리는 가져다가 사용만 하면된다. 자세한 내용 및 내부구현은 레퍼런스 문서를 보면 알 수 있다. 본론 @PostConstruct 는 서버가 실행될 때 빈으로 등록되 있는 인스턴스를 스프링 컨텍스트에 올려 초기화를 진행할 때, 위 어노테이션이 붙어 있는 메소드를 호출한다. 그리고 메소드에 등록되 있는 어떠한 작업을 실행한다.@Componentpublic class DBClear { @Autowired private UserRepository userRepository; @PostConstruct private void postConstruc..
들어가며오늘은 프로젝트에서 로그 메시지에 대한 내용을 수정하기 위한 작업을 해볼 예정입니다. 로그 메세지를 왜 수정해야 할까요? 이미 스프링부트 환경에서는 자동으로 로그메세지도 제공해주고,Error 면 Error, Info 면 Info 알아서 나오지 않나요? 라는 생각을 할 수 있습니다. 하지만 로그도 하나의 코드라는 생각으로 스프링에서 제공해주는 일반적인 로그가 아닌내가 알아보기 편한, 즉 가독성(=읽기 편한) 로그를 만들어주는 것 또한 중요하다고 생각합니다. 실질적으로 서비스를 운영하면, 다양한 환경에서 Error 및 Info 로그를 체크해야 할 일이 많습니다. 그 로그들을 편리함,가독성, 팀원 과 공통적인 설정, 여러가지 보안적인 부분 프로젝트 스펙을 클라이언트와 맞추기 위해서 로그 스펙을 설정..
안녕하세요오늘은 스프링 프레임워크에서 세션 및 쿠키를 다루는 방법에 대하여 알아보겠습니다. 세션과 쿠키는 클라이언트와 서버의 연결을 유지하는 방법입니다 우리가 사용하는 웹 브라우저에 서비스는 HTTP 프로토콜을 기반으로 통신을 합니다.그리고 그 HTTP 프로토콜은 클라이언트와 서버의 관계를 유지 하지 않는 특징이 있습니다. 그 대표적인 특징 2가지가무상태성 (Stateless)비연결성(Connctionless) 위 사진을 보면 한번 요청이오고 그 요청에 응답이 오면 바로 연결을 끊는다.만약에 그러면 로그인을 하는 상황이라면 어떨까요?로그인을 해서 여러 기능을 이용해야 하면은, API요청을 할 때마다 로그인을 해야할까요? 만약 실제로 그렇다면은...... 엄청나게 귀찮을 겁니다.매번 요청하고 연결이 끊기..
안녕하세요🖐 오늘은 비밀번호 유효성 검사에 대한 예제를 통하여 TDD에 대해서 공부를 해보았습니다. 비밀번호 유효성 검사 조건 길이가 8글자 이상 0부터 9사이의 숫자를 포함 대문자 포함 - 모든 규칙을 충족하면 STRONG - 2개의 규칙을 충족하면 NORMAL - 1개의 규칙을 충족하면 WEAK 위 조건을 만족하는 테스트 코드를 작성해야 합니다. 암호 검사를 하는 경우를 생각해봤을 때, 가장 쉽거나, 가장 예외적인 상황은 무엇일까? 모든 규칙을 충족하는 경우 모든 규칙을 충족하지 않는 경우 모든 규칙을 충족하지 않는 경우는 모든 조건을 다 걸어야하기 때문에, 로직이 복잡하게 짜인다. 그러나 모든 규칙을 충족하는 경우는 쉽게 테스트를 통과시킬 수 있습니다. 바로 시작해보겠습니다. 1) 모든 규칙을 충족..
안녕하세요🖐 오늘은 제가 토이프로젝트 시작에 앞서, 어떻게 패키지를 구성하고, 파일을 관리할지 고민을 하던 중에 스프링 계층 구조에 대해서 알게되어서 공부하게 되었습니다. 그 내용을 포스팅 해보겠습니다. 저는 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 라는 책을 보며, 스프링 계층구조에 대하여 자세히 알게되었습니다. 위 사진이 대표적인 스프링의 계층 구조라고 합니다. 각각의 계층은 계층마다 독립적으로 분리하여 구현하는 것이 가능해야하고, 각 계층에서 담당해야 할 기능들이 있다. Web Layer(= Presentation Layer) 우리가 흔히 사용하는 Controller와 View 영역입니다. 스프링을 사용하면서 MVC패턴을 들어보셨을 것이라고 생각합니다. 그 중에서 View와 Controlle..
안녕하세요🖐 제가 Springboot + JPA 공부를 하다가 궁금한 점을 포스팅 해보겠습니다. 저는 Dto를 생성할 때 항상 기본 자료형으로 선언을 했습니다 public class DtoA { private long id; private String name; private int age; private String addr; } 이런식으로 Dto를 구성하여도 크게 문제는 없었습니다. 왜냐하면 평소에 ORM은 Mybatis를 위주로 프로젝트를 진행하였고, 대부분 Mybatis를 활용했기 때문 입니다. 실제로 위 필드를 기본자료형으로 해서 생긴 문제 또한 없었습니다.. 그러나 현재 트렌드인 JPA를 공부 중에 모든 Dto 구성 자료형을 기본 타입이 아닌 래퍼 타입으로 구성을 합니다. 왜 그런지 궁금해졌고..