Spring

Spring

Java Dto 를 Kotlin Dto로 변경하면 생기는 문제

이번에 총 4건의 에러가 발생해서 급하게 롤백을 진행했던 사례(정말 다행히 대고객 영향은 없었습니다)에 대해서 말씀드리도록 하겠습니다 정말 간단하게 요약을 하면 과정은 다음과 같습니다 1. 제 서버의 Java의 Dto 클래스를 Kotlin의 data class로 변경했습니다 2. 이를 사내 nexus에 배포하였습니다 3. 이를 sdk 형태로 의존하고 있는 다른 서버를 배포했습니다 4. Jackson Deserialize Exception 이 발생해서 바로 롤백을 했습니다 제 기존 JavaClass 에는 NoArgumentConstructor 가 달려있었지만, data class로 변경한 클래스에는 noArgumentConstructor 가 없습니다 이런 상황을 해결하기 위해서 KotlinModule을 등..

Spring

여러분들은 동적 쿼리 어떻게 쓰시나요? (우리 팀에서Jpa Criteria 를 선택한 이유)

오늘은 자바에서 사용할 수 있는 다양한 동적 쿼리 방법을 알아보고, 왜 Jpa Criteria를 선택했는지 말씀드리려고 합니다 이번에 프로젝트에서 어드민 페이지를 만들던 과정에서 여러 가지 조건으로 필터링되어야 하는 데이터를 쿼리 할 필요가 생겼습니다. 상태가 성공인 데이터를 여러 조건에 맞게 조회해야 하는데요 원본 데이터는 총 3000건 정도이고, 상태가 성공인 건은 1500건 정도입니다. 처음에 생각했던 방법은 총 5가지 정도가 있었습니다. 동적 쿼리의 종류 1. findAll을 사용한 이후에 Application에서 처리한다 @Component class ApplicationQuery( private val userRepository: UserRepository ) { fun findUserByNa..

Spring

MDC 를 활용해 부가적인 정보를 남겨보자

MSA 환경으로 오면서, 특정 사용자가 어떤 행동을 했는지 파악해서 대응하기 어렵습니다 어려운 이유는 여러 가지가 있을 수 있는데요 1. 로그가 각 서비스마다 흩어져있다 2. 하나의 API 호출에서 발생한 로그들을 묶어서 볼 수 없다 1을 해결하기 위해서 보통 로그를 중앙에서 모아서 관리하게 되는데요 이를 위해 현재 제가 일하고 있는 곳에서는 하나(이중화는 고려하지 않겠습니다)의 거대한 Elastic Search 클러스터를 구성해 두고, 그 클러스터에서 모든 로그를 모아서 관리하고 있습니다 2번째 문제를 해결하기 위해서 API Gateway에서 eventId를 만들어 요청에 헤더에 포함시킨 후 릴레잉 해줍니다. 그 eventId를 로그에 포함시켜서, 이벤트 id 기준으로 묶어서 로그를 확인하고 있습니다...

Spring

테이블을 병합할 때, Auto Increment를 주의하자

문제 상황 같은 형태의 테이블 2개를 하나의 테이블로 합쳤을 때, Auto Increment 때문에 생길 수 있는 문제에 대해서 정리를 해보려고 합니다 편의를 위해서 정말 간단한 엔티티로 설명을 드리도록 하겠습니다 @NoArgsConstructor @AllArgsConstructor @Getter @Entity @Table(name = "transaction_data") public class TransactionData { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "name") private String name; public TransactionData(String name) { thi..

Spring

공유 자원을 관리하는 bulk head에 대해서 알아보자

벌크헤드에 대해서 간단하게 알아보겠습니다 Bulk Head는 한 가지 작업에서 동시에 사용될 수 있는 자원을 제한하는 방식입니다. 서버 개발에서는 보통 한 API에서 최대 N개까지만 동시에 호출될 수 있다는 제약 조건을 걸게 됩니다. 톰캣 스레드(외부에서 요청을 받는 스레드)가 200개가 존재하고 있을 때, 한 API에서 총 199개까지만 호출될 수 있다고 하면, 1개는 무조건 다른 쪽에 배정될 테니 다른 기능이 최소한 어느 정도는 동작하는 것을 보장할 수 있습니다. 이 제한이 왜 필요한지 아직 전혀 감이 오지 않으시죠? 보통 다른 API 를 호출할 때, 몇 번 이상 호출하면 안 된다는 제약을 거는 것은 봤어도 우리 서비스에 동시에 몇 개 이상 호출이 되면 처리를 못하게 막는다는 것은 이상할 테니까요 이..

Spring

스프링에서 발생한 에러 로그를 슬랙으로 모니터링하는 방법

안녕하세요 카페인팀 nunu입니다. 오늘은 스프링에서 발생한 에러 로그를 슬랙으로 모니터링하는 방법에 대해서 알아보려고 합니다. 목차는 다음과 같습니다. 스프링에서 로그를 남기는 방법 Slf4 j의 동작원리 Logback의 동작원리 Logback을 사용해서 슬랙으로 에러 로그를 모니터링하는 방법 스프링에서 로그는 어떻게 찍을까? 스프링에서 로그를 찍는 방법은 여러 가지가 있지만, 가장 간단한 방법은 System.out.println()을 사용하는 것입니다. @RestController public class TestController { @GetMapping("/test") public String test() { System.out.println("test"); return "test"; } } 당연하..

Spring

Application Context vs BeanFactory

스프링 컨텍스트에는 2가지 종류가 있습니다 1. ApplicationContext 2. BeanFactory 간단하게 설명하면 Application Context는 Bean Factory를 확장했다고 볼 수 있습니다 BeanFactory BeanFactory 는 org.springframework.beans.factory 안에 정의된 인터페이스입니다 간단하게 bean 이름이나, 타입을 바탕으로 빈을 가져올 수 있는 기능을 가지고 있습니다 Object getBean(String name) throws BeansException; boolean isSingleton(String name) throws NoSuchBeanDefinitionException; boolean isTypeMatch(String na..

Spring

DispatcherServlet 알아보기 - HttpServletBean편

지금까지 했던 부분입니다 오늘 해볼 부분은 HttpServletBean과 추가적인 부분입니다 HttpServletBean HttpServlet을 확장하고 있고, bean를 초기화하기 위한 init() 메서드가 정의되어 있습니다 핵심적인 메서드는 총 2가지입니다. 1.init() 메서드 @Override public final void init() throws ServletException { // Set bean properties from init parameters. PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties); if (!pvs.isEmpty()) { try { BeanW..

Spring

Test 의 db 롤백 어디까지 알아보셨나요?

문제 상황 SpringBootTest를 사용하던 상황에서 db 롤백이 이루어지지 않아서 테스트 간 격리가 이루어지지 않는 상황이 발생하였는데요 이를 바탕으로 어떻게 test 마다 어떻게 Transactional 이 적용되는지, 그리고 어떤 경우에 롤백이 되지 않는지, 이를 해결하기 위한 방법은 어떤 것이 있는지에 대해서 정리해 보겠습니다 Test에서 Transactional 은 롤백된다 test에서 transactional 이 사용되면 자동적으로 롤백이 됩니다. 여기 적혀 있는 것처럼 db 호출은 자동적으로 rollback이 되어 매 테스트마다 깨끗한 db 상태를 유지할 수 있습니다 Junit과 함께 사용될 경우에 메서드마다 호출되는 @BeforeEach와, @AfterEach는 트랜잭션으로 묶여 있습니..

Spring

DispatcherServlet 알아보기 - Servlet 편

지금까지 한 부분은 다음과 같습니다 Aware 알아보기 ServletConfig와 ServletContext 알아보기 전 글을 통해서 알아보실 수 있습니다 오늘 할 부분은 다음과 같습니다 그러면 Servlet 부터 바로 시작해보도록 하겠습니다 Servlet 클라이언트의 응답을 받아 적절한 결과를 돌려주는 프로그래밍 기술정도로만 생각하셔도 좋을 것 같습니다 Servlet 에 대해서 알아보고 싶으시다면 https://mangkyu.tistory.com/14 쪽을 참조해도 좋을 것 같네요 추가로 기억하시면 좋을 부분은, Servlet 에서 꼭 html 만을 반환할 필요는 없다는 점입니다 총 5가지 메서드로 이루어져 있습니다 1. servlet 을 생성한 이후에 호출되는 init 메서드. 초기화 이후에는 con..

be-student
'Spring' 카테고리의 글 목록