로깅은 애플리케이션 문제 해결의 오랜 역사와 관찰 가능성의 세 가지 주요 요소(메트릭, 트레이스와 함께) 중 하나입니다. 운영 환경에서 아무런 정보 없이 문제를 해결하기는 어려우며, 장애가 발생했을 때 개발자들은 로그 파일이 있는 것을 반가워합니다. 로그는 주로 사람이 읽을 수 있는 형식으로 작성됩니다. 구조화된 로깅은 로그 출력을 잘 정의된, 종종 기계가 읽을 수 있는 형식으로 작성하는 기술입니다. 이러한 형식은 로그 관리 시스템에 입력되어 강력한 검색 및 분석 기능을 가능하게 합니다. 구조화된 로깅에 가장 일반적으로 사용되는 형식 중 하나는 JSON입니다. Spring Boot 3.4에서는 기본적으로 구조화된 로깅을 지원합니다. Elastic Common Schema (ECS)와 Logstash 형식..
스프링부트에서 테스트 코드를 작성할 때 자주 사용하는 @Mock과 @MockBean의 차이점. 이 두 어노테이션은 모킹(Mocking)을 통해 테스트를 효율적으로 작성할 수 있게 해주지만, 용도와 환경이 다르다. 또한, 리포지토리, 서비스 레이어, 컨트롤러 테스트 시 어떤 상황에서 어떤 어노테이션을 사용하는 것이 좋을지 작성.@Mock@Mock은 Mockito 프레임워크에서 제공하는 어노테이션이다. 특정 클래스의 모킹된 객체를 생성하며, 이 객체는 스프링 컨텍스트와는 무관하게 독립적으로 동작한다.@MockBean@MockBean은 스프링 부트에서 제공하는 어노테이션이다. 스프링 애플리케이션 컨텍스트에 모킹된 빈을 추가하고, 실제 스프링 빈 대신 모킹된 빈을 주입한다. 주로 통합 테스트 환경에서 사용된다...
spring.threads.virtual.enabled=true spring docs에서는 애플리케이션에 이 옵션을 켜기 전에 공식 Java 가상 스레드 설명서를 읽어보시기 바랍니다 라고 쓰여져있다. WarningOne side effect of virtual threads is that they are daemon threads. A JVM will exit if all of its threads are daemon threads. This behavior can be a problem when you rely on @Scheduled beans, for example, to keep your application alive. If you use virtual threads, the scheduler ..
Spring Framework에서 AOP(Aspect-Oriented Programming)는 강력한 트랜잭션 관리 기능을 제공합니다. 이 기능은 다양한 애플리케이션에서 트랜잭션을 효율적으로 관리할 수 있게 해주지만, 때때로 예상치 못한 문제가 발생하기도 합니다. 이 글에서는 Spring Data JPA를 사용하면서 자주 마주치는 self-invocation 문제와 그 배경에 대해 설명하고, Spring의 AOP가 어떻게 트랜잭션 관리에 적용되는지 구체적으로 살펴보겠습니다. AOP와 트랜잭션 관리란? Spring Framework에서 AOP(Aspect-Oriented Programming)는 다양한 곳에서 사용되는 로직을 한 곳에 모아 관리할 수 있게 해주는 프로그래밍 기법입니다. 예를 들어, 보안, ..
에러스택 Resolved [org.springframework.http.converter.HttpMessageNotWritableException: No converter for [class com.example.demo.controller.ResourceController$$Lambda$821/0x000000011a429db0] with preset Content-Type 'application/octet-stream'] 환경 spring boot 2.4.x 외부 파일을 다운로드 하는 Controller에서 에러 발생 문제가 된 코드 @RestController public class ResourceController { @GetMapping("/resource") public ResponseEntit..
일반적으로 enum 클래스는 마셜링할 때 enum 상수 이름 그대로 변경된다. 마셔링 과정에서 enum 상수를 변경할 때 toString() 메서드를 사용하고, 이 메서드가 enum 상수 이름을 리턴하기 때문이다. 이런 방식은 REST-API 응답을 유연하게 설계할 수 없고, REST-API 설계에 따라 코드에도 영향을 주므로 유연한 프로그래밍을 할 수 없다. 그래서 응답 값과 enum 상수 값은 따로 분리하면 좋다. ex) 애플리케이션 에서는 SINGLE 이라는 enum 상수값이지만 클라이언트에게 응답할 때는 "single"이라는 문자열 값을 리턴. public enum HotelRoomType { SINGLE("single"), DOUBLE("double"), TRIPLE("triple"), QUAD..
jaxb 사용해서 xml을 http body로 떨구어줄 때 해당 태그를 없애는 방법 Jaxb2RootElementHttpMessageConverter의 하위 클래스를 직접 생성하고 마샬러를 사용자 정의한다. @Configuration class XmlConfiguration { @Bean Jaxb2RootElementHttpMessageConverter jaxb2RootElementHttpMessageConverter() { return new Jaxb2RootElementHttpMessageConverter() { @Override @SneakyThrows protected void customizeMarshaller(Marshaller marshaller) { marshaller.setProperty..
환경 spring boot 2.7.10 스프링 배치에서 특정 Job만 실행하고 싶을 때 여러 블로그에서 봤을 때는 properties 파일이나 yaml 파일에 아래와 같은 속성을 넣고 spring.batch.job.names=${job.name:NONE} 실행 시 Program Argument에 아래와 같이 실행 --job.name=특정잡이름 이렇게 하라고 하는데 잘 안된다.. 버전이 바뀌고 나서 안되는 건지는 잘 모르겠는데 구글링 하다가 찾은 방법으로 된다. 해결 Program Argument에 아래와 같이 작성 --spring.batch.job.names=특정 잡이름 추가로 여기서 job의 이름은 job1234 이다. 나는 잡의 이름이 Bean이 생성될 때의 이름인줄 알고 계속 job1을 argume..
- Total
- Today
- Yesterday
- intellij
- rocky
- k8s
- Github Status
- svn
- jQuery
- Spring
- config-location
- Java
- Kotlin
- Bash tab
- elasticsearch
- LocalDate
- 오라클
- docker
- 베리 심플
- 북리뷰
- mybatis config
- oracle
- LocalDateTime
- Mac
- localtime
- input
- mybatis
- springboot
- window
- JavaScript
- maven
- Spring Security
- Linux
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |