GitHub

https://github.com/Choidongjun0830

Spring 78

로깅 개선하기

개발 초기에는 로그를 보기 쉽게 여러 줄로 출력했습니다. 각 항목을 줄마다 구분해두면 사람이 읽기에는 편하다고 생각했기 때문입니다. 하지만 리뷰어인 로키의 피드백을 통해 로그는 사람이 아닌 도구가 읽기 쉬워야 한다는 점을 알게 되었고, 이후 로그를 한 줄로 기록하는 방향으로 개선하게 되었습니다. 1. 로그는 왜 한 줄이어야 할까?사람이 아닌 시스템이 로그를 읽는다 처음에는 다음과 같은 식으로 로그를 찍었습니다:[ReservationService.createReservation]요청 사용자 ID: 123요청 날짜: 2025-06-01요청 테마 ID: 7하지만 로그 분석 도구나 CLI 기반 필터링 도구 입장에서는 이 로그는 4줄짜리 로그가 아니라, 4개의 독립적인 이벤트처럼 인식될 수 있습니다. 이는 다음과..

Spring 2025.06.10

Spring Bean 등록 방법 비교

Spring Bean이란?Spring에서 IoC 컨테이너(Spring Context, Spring Container)가 관리하는 객체를 Bean이라고 부른다.IoC는 제어의 역전을 이르는 말인데, 개발자가 직접 객체를 생성하고 관리하지 않고, Spring Container가 이 역할을 대신 수행하는 것처럼, 개발자가 관리하던 것을 외부에서 관리해주는다는 것이다.IoC를 통해 가져올 수 있는 장점은,Spring Container (Spring Context)Spring Bean의 생명 주기를 관리하며, 생성된 Spring Bean들에게 추가적인 기능을 제공한다.추가적인 기능?Bean의 생명 주기 관리 또한, IoC와 DI의 원리가 스프링 컨테이너에 적용된다.IoC와 DI의 원리Spring Container..

Spring 2025.05.21

@RequestBody의 동작 원리와 @ModelAttribute

@RequestBody Request 메시지나 Response 메시지에 담기는 Body의 대표적인 데이터 형식은 JSON이다.@RequestBody는 JSON 형식의 데이터를 자바 객체로 변환한다. ```@Controllerpublic class UserController { @PostMapping("/users") @ResponseBody public ResponseEntity createUser(@RequestBody User user) { users.add(user); return ResponseEntity.ok(user); }}//요청 예시{ "name": "홍길동", "age": 30}->위 요청이 들어오면, @RequestBody에 의해 name은 "홍길동", ag..

Spring 2025.04.16

[원티드 백엔드 챌린지 11월] 테스트 코드와 API 문서화 자동화

ArchUnit아키텍처에 대해 정리한 문서 없이도 서술적인 메서드명을 통해서 아키텍처 구조에 대해서 이해할 수 있고, 아키텍처의 규칙 또한 쉽게 정의할 수 있으며 더불어 검사 기능까지 제공해주는 테스트 툴 라이브러리프로젝트의 아키텍처 구조를 Test Code로 강제화하는 방법론 적용 방법1. 의존성 추가testImplementation("com.tngtech.archunit:archunit-junit5:1.2.1")2. 아키텍처에 대한 규칙 정의; 시나리오 작성예시Controller 계층에서는 Service 계층만 참조 가능presentation.web 패키지의 클래스는 port.in 클래스에만 의존해야 한다.presentation.web 패키지의 하위 클래스는 @Controller나 @RestContr..

Spring 2024.11.22

[원티드 백엔드 챌린지 11월] 객체지향스러운 아키텍쳐 설계

Encapsulation객체의 변수와 메서드를 하나로 묶고, 실제 구현 내용 일부를 외부에 감추는 기술 public API를 구현하는데 사용되는 내부 상태와 행동을 내부로 숨기는 것접근 제한자를 이용해서 캡슐화를 설계 및 적용 캡슐화를 지키지 않으면 생기는 문제들캡슐화를 지켰을 때 얻을 수 있는 변경의 유연함을 잃어버림예를 들어, 변수가 public이라 client가 변수의 값을 직접 수정했는데, 만약 변수명이 바뀌어버린다면, client가 직접 쓴 변수명도 같이 수정해주어야 한다. 불변식이 깨져서 설계자의 의도대로 동작을 하지 않아 예외가 발생할 수도 있다. => 최대한 모든 요소를 private으로 선언해놓고, 접근 가능 범위를 한단계 (default > protected > public)씩 넓혀가는..

Spring 2024.11.22

[원티드 백엔드 챌린지 11월] Spring의 기능 자세히 살펴보기

Servlet Web Page 또는 결과 값을 동적으로 생성하는 역할을 하는 자바 프로그램Controller와 Service 레이어가 함께 묶여져 있는 것 Spring Boot = Tomcat + SpringTomcat (WAS (Web Application Server))Web server + Servlet Container의 결합으로 다양한 기능을 컨테이너에 구현하여 다양한 역할을 수행할 수 있는 서버Web Server네트워크 처리(HTTP 및 Socket): Client의 요청부터 응답까지 전반적인 네트워크 처리 역할정적 리소스 처리: HTML, CSS, JS와 같은 리소스만 처리Servlet ContainerServlet 관리 및 처리: 동적 페이지 생성 및 처리Web Server와 네트워크 처리..

Spring 2024.11.22

로딩 페이지 (ajax 이용)과 Validation 적용하기

재사용을 위해 loading.html 만들기 Loading...  로딩 페이지를 사용할 페이지 html에 적용 body에 div 추가 script 추가ajax를 통해 로딩이 끝나는 때를 알 수 있음. 추가해둔 #loadingContainer에 loading.html 넣는 함수function includeLoadingHTML() { $('#loadingContainer').load('/fragments/loading.html', function (responseText, textStatus) { if (textStatus === "success") { $('.load..

Spring 2024.08.29

Querydsl에서 동적 쿼리와 함께 페이징하기

PageImpl같은거 만들라하는데 잘모르겠어서 그냥 UserInsuranceSearchDto를 만들어서 검색 결과인 contents랑 검색 결과의 총 개수를 나타내는 count를 필드로 만들었다. @Datapublic class UserInsuranceSearchDto { private List content; private long count;} 그리고 정렬은 어차피 보험 가입 날짜를 기준으로 내림차순 정렬하고, 보험 가입 날짜가 같은 경우에는 id를 기준으로 오름차순 정렬했다. 그래서 Controller에서는 pageNo만 @RequestParam을 통해 받았다.@ModelAttribute InsuranceSearch insuranceSearch는 동적 쿼리를 위한 검색 조건들을 입력하기 ..

Spring 2024.08.08

[JPA 활용 2편] API 개발 고급 - 실무 필수 최적화

OSIV와 성능 최적화Open Session In ViewJPA의 영속성 컨텍스트와 데이터베이스 커넥션은 밀접한 관련이 있다.서비스 계층에서 데이터베이스 트랜잭션 시작 시에 JPA의 영속성 컨텍스트가 데이터베이스 커넥션을 가져온다. Open Session In View는 트랜잭션이 끝나도 영속성 컨텍스트와 데이터베이스 커넥션을 유지하는 것이다. 끝까지 살아있다가 응답이 나가면 그때 데이터베이스 커넥션을 돌려주고 영속성 컨텍스트가 사라진다. 그래서 지연 로딩이 가능했던 것이다. 하지만 이 전략은 데이터베이스 커넥션 리소스를 계속 사용해서 커넥션이 모자라 장애로 이어질 수 있다. OSIV를 Off서비스 계층에서 트랜잭션을 종료할 때 영속성 컨텍스트를 닫고, 데이터베이스 커넥션도 반환한다.커넥션 리소스를 낭비..

Spring 2024.07.08

[JPA 활용 2편] API 개발 고급 - 컬렉션 조회 최적화

컬렉션인 일대다 관계 (OneToMany)를 조회하고 최적화하기. 일인 쪽이 하나고, 다 쪽이 3개면 전체 row가 3줄로 뻥튀기가 된다. 이 경우에는 최적화하기 어렵다.  주문 조회 V1: 엔티티 직접 노출엔티티를 직접 노출하기 때문에 사용하면 안된다. 주문 조회 V2: 엔티티를 DTO로 변환DTO안에 엔티티가 있으면 안된다. 이 경우에도 다 노출이 되어버린다. 엔티티에 대한 의존을 완전히 끊어야 한다. 속에 있는 엔티티도 DTO를 만들어서 바꿔주어야 한다. 하지만 N+1 문제 발생주문 조회 V3: 엔티티를 DTO로 변환 - 페치 조인 최적화데이터가 뻥튀기 된다고 하셨는데 Hibernate6부터는 distinct가 되어서 뻥튀기 되지 않음.hibernate5를 사용하면 em.createQuery()를 ..

Spring 2024.07.05
728x90