728x90
반응형

Spring 21

@Transactional 제대로 알고쓰기

예제는 깃허브에 있다. 트랜잭션을 공부했다고 생각하고 업무에 임했던 나였는데, 도저히 풀리지않는 느낌으로 예외를 받았던게 있다. 이전에 한번 포스팅했던 Stream Closed 에러였는데 이게 또 한번 나를 붙잡았다. 처음 개발환경에서 OpenFeign을 사용하면서 또 logging level에서 IOException이 나는줄알고 이부분으로 삽질을 했다. 근데 그게 아니어서 이 포스팅을 작성했다. HelloController.java @RestController @RequiredArgsConstructor public class TestController { private final TransactionParentService transactionParentService; @GetMapping("/tra..

디버깅 2023.02.27

FeignClient Logging level 디버깅

회사의 서비스들이 여러개로 쪼개져있다. 그래서 우리는 주로 FeignClient를 사용하는데, 애를 먹었던 로깅레벨에 대해 포스팅한다. 업무중에 삽질을 진행했었으며, 해당 내용으로 자바스럽게 고쳤던 경험을 좀 풀어본다.. 스프링 프레임워크를 사용하고 있기에 여기서 같이 제공해주는 Spring Cloud의 OpenFeign을 사용하였다. 아래는 사용하는 예시이다. 해당 예시처럼 나는 FeignClient를 구현했었다. 물론 @EnableFeignClients 는 별도의 Configuration 클래스 파일에 설정을 해주었었다! 여기까지는 일단 기본적인 설정이지만, 아래의 레벨 설명이 진짜다. Feing Logging Level은 총 4단계로 이루어져있다. NONE: 로깅 없음(Default) BASIC: ..

디버깅 2022.12.17

@Async 사용시 에러 해결

오랜만에 포스팅하는데 회사에서 그동안 앱 2.0 버전을 출시한다고 이래저래 바빴던 나날을 보냈다. 결과적으로는 만족스러운 출시..? 였던것 같다 ㅋㅋㅋ 버그도 많았고, QA 엔지니어께서 고생을 많이 하셨을 수도 있고 내가 구현한 메시지 플랫폼도 테스트하기가 정말 까다로웠다. 각설하고.. 해당 에러사항을 구현하는건 Kafka를 이용하지 않아도 되기 때문에 RestAPI로 구현했다. (+ 테스트코드로만) 모든 코드는 깃허브에 있다. 이번엔 무슨 버그였냐? 이런 에러가 쏟아져나왔다. 기존 레거시 푸시는 NHN Toast를 이용한 푸시서비스로 구성되어 있었다. 변경한다고 해도 과도기가 존재하기 때문에 바로 지울수는 없고 이전 앱을 사용하는 사용자들에게는 해당 푸시로 알림은 계속 받아야되기 때문이다. 왜 났던 에..

디버깅 2022.11.04

Spring Kafka Deserializer Class Not Found Exception

현재 회사에서 spring-kafka 를 이용해서 특정 서비스들의 푸시 메세지 이벤트를 받아서 전송해주는 서버를 구현하고 있다. (오늘 쿠버네티스에 배포까지 했다!! 모르는게 너무많은...) 로컬에서 내 맘대로 메세지 토픽을 발행해서 쏴도 잘 맞게 역직렬화를 수행을 해주길래 그냥 그런가보다. 하고 잘 넘어갔던 찰나에!!! Class Not Found Exception 왜? 이 에러가 났을까? 일단 나는 구독하는쪽 그러니까 Kafka에서는 Consumer 쪽 만을 구현해주었다. 내 지식이 부족했던 탓인지는 모르겠지만, 어쨌든 같은 JSON 형태라고 생각해서 클래스가 무엇이던 간에 JSON형식만 같다면 Consume해도 괜찮을 것이라고 처음 생각했었다. 그래서 발행 모델인 Producer쪽에서는 예를 들면 ..

Spring/Kafka 2022.09.16

@ModelAttribute, @RequestBody 커맨드 객체

ModelAttribute와 RequestBody의 커맨드 객체 파싱이 다른것을 확인했다. 한번 알아보자! ModelAttribute 동작과정은 덤이다. ModelAttribute 이 포스팅을 하는 이유는 인자가 많을 경우에 post방식으로 조회를 하는 식으로 구성을 했었는데, 코드리뷰중에 이런말이 나왔었다. get방식으로 다른 객체로 묶어서 한번에 받아보는건 어떤가요? 변수가 많아지면 많아질 수록 수정점이 늘어날것 같아요! 라고 받았다. 그래서 무의식적으로 평소에 하던방식처럼 post로 수정하여 커밋하고 수정했었다. 근데 post로 안바꾸고 get에서 @ModelAttribute 사용하면 객체로 파싱이 된다는것을 듣고 내가 부족했구나 싶었다. 이 글은 그 부분에서 나와 집에와서 따로 정리하여 포스팅한다..

Spring 2022.09.15

배치 에러 개선기

업무에서 Spring Batch로 세미나를 진행하고, 앱 푸시 기능을 배치로 전환하는 작업을 진행했다.여기에 저장하면서 글로만 보던 것들을 직접 경험해보면서 겪었던 일들을 기록하려고한다.첫번째 에러우리 푸시 배치 서버의 구조는 스프링 스케줄러 서버에서푸시 서버의 api를 호출해서 해당 job들을 돌려주는 방식으로 구성이 되어있다.물론 이 부분을 새롭게 개편해야 하는것은 맞다ㅋㅋㅋ그래서 특정 시간이 되면 해당 job api로 호출을 하는데여기서 대략 총 데이터가 100,000건 정도 되는데 전부 동기 + 블록킹처리로 진행했다.그래서 스케줄러가 api를 쏘고 요청값이 최대 오래걸려도 limit을 30분을 잡았었다.그런데 100,000건의 데이터를 여러 로그를 쌓고, 푸시를 하는데까지 1시간이 넘게 걸렸었다...

Spring 2022.08.11

@Valid, @Validated 차이

@Valid @Validated 차이 @Valid @Valid는 JSR-303표준 스펙이다. org.hibernate.validator.internal.constraintvalidators 안에 구현된 여러 Validator 구현체들로 인해 값을 검증해준다. 이의 핵심은 LocalValidatorFactoryBean 이며, 나는 스프링 부트를 사용하였기 때문에 자동으로 구성이 된다. 동작 원리 기본적으로 컨트롤러에서 @Valid가 없더라도 유효성 검증을 처리하는 로직을 지나간다. 이유는?? InvocableHandlerMethod는 적절한 파라미터 처리기를 찾으려고 HandlerMethodArgumentResolverComposite로 보낸다. 얘가 처리해줄 resolver를 찾는데 getArgument..

Spring 2022.08.10

AOP

예제는 깃허브에 있다. AOP (Aspect Oriented Programming) AOP는 스프링의 핵심 구성요소중 하나이다. 관점지향 프로그래밍은 프로그램 구조에 대한 또 다른 사고방식을 제공하며 객체 지향 프로그래밍을 보완해준다. OOP의 모듈화 핵심 단위 클래스 AOP의 모듈화 단위 관점 (aspect) AOP는 횡단 관심사의 분리를 허용해주어 모듈성을 높이는 것을 목표로 하는 패러다임이다. 코드 자체를 수정하지 않고 기존 코드에 추가 동작을 추가해서 수행한다. 개념 그리고 용어 Aspect 여러 클래스에 중복되어 있는 관심사의 모듈화 대표적인 예로 트랜잭션 관리가 있다. Spring AOP 에서는 @Aspect를 사용한다. JoinPoint 메소드 실행이나 예외 처리와 같은 프로그램 실행중인 지..

Spring 2022.08.10

@ExceptionHandler

@ExceptionHandler 예외 처리기가 어떻게 동작하는지에 대해서 궁금했어서 업무중에 돌려보게 되었다. (예제코드는 다시 작성할 예정) 일단 동작과정은 DB에서 해당 id를 찾아 검색했을 때 없을 경우 예외를 던져주게 하는 예시 간단하게 보면 public class UserService { private final UserRepository userRepository; public User findById(final int id) { return userRepository.findById(id) .orElseThrow(() -> new NotFoundException("해당 유저를 찾을 수 없습니다")); } } 라고 로직을 구성했을 때 이 로직의 예외에 대한 핸들러 동작을 파보게 되었다. 일단 ..

Spring 2022.08.10
728x90
반응형