안녕하세요. 오늘은 Spring Boot 서버가 종료될 경우 클라이언트의 요청에 대해서 응답받지 못한 이슈에 대해 공유하고자 합니다. 클라이언트는 별도의 spring boot 서버였고 서버A라 지칭하겠습니다. 네트워크 타임아웃에 대해서 30초의 간략한 시간으로 설정해두었습니다. 서버는 마찬가지로 별도의 spring boot 서버였고 서버B라 지칭하겠습니다. 서버A에 의해 다수의 요청을 받는 환경에서 서버B를 종료했을 경우, 서버A에서 네트워크 타임아웃이 발생하였습니다. 그 이유는 바로 서버B의 종료가 급격하게 이루어짐으로써 몇개의 요청에 대한 응답이 유실되었기 때문인데요. 이것은 서버의 종료(shutdonw) 속성이 IMMEDIATE 으로 되어있었기 때문입니다. 해당 속성은 서버가 종료될 때, 들어온 요..
안녕하세요. 오늘은 스프링 프레임워크를 사용할 때, 반드시 숙지해야되는 개념인 DI(Dependency Injection), 의존주입에 대한 이야기를 진행해보려고 합니다. 우선 DI라는 개념은 스프링에만 존재하는 개념은 아닙니다. 기존에 다른 프레임워크에서부터 발전해온 개념으로 IOC를 구현하기 위해 사용되던 방법으로 DI를 써왔는 흐름으로 알고 있습니다. 따라서 Spring에서 봤던 DI와 기존 DI간의 매치가 아직 안되신분들이 있을 것 같아서 그것부터 바로잡아 보겠습니다. Dependency Injection 우선 기존의 의존주입을 보기전에, 의존이라는게 어떤 것인지부터 알아야합니다. Spring MVC를 토대로 개발을 해왔던 분이시라면 충분히 아시겠지만 다시 정리하는 차원에서 의존이란 아래의 코드를..
안녕하세요. 저는 현재 java/spring 환경에서 upbit API를 활용하여 트레이딩 시스템을 개발하고 있습니다. 트레이딩 시스템은 현재 1차 배포까지 완성이 되어 트레이딩을 진행하고 있으며, 그간에 있었던 내용중 공유하고자 하는 내용이 있어 글을 작성합니다. 현재 트레이딩 시스템의 가장 주요한 난제는 알고리즘 최적화입니다. 적절한 알고리즘에 따라 필요하지 않은 로직은 수행하지 않고 시간을 많이 잡아먹는 로직, 혹은 코인에 대해 트래킹이 필요하고 왜 그랬는지 대처를 해야 좀더 적절한 대응이 가능하게 됩니다. 그 중 가장 기본은 각 코인당 발생하는 동일한 service를 태웠을 때 허용 가능한 시간동안의 로직을 수행했느냐를 체크하는 것이 필요했습니다. @Slf4j @RequiredArgsConstru..
스프링 부트로 잘 개발을 하다가 가끔 개발환경이 바뀌거나 낯선 환경에서 다시 개발을 진행해야할 때 부트올라가는 속도가 많이 느려질 때가 있다.(저같은 경우는 자바에서 코틀린으로 변경했을 때 서버 올라가는 속도가 현저히 느려졌음) 스프링부트 디펜던시도 web이랑 lombok 두개가지고 예제코드 작성하면서 놀고있었는데... 갑자기 20초대의 실행속도라니 미치고 팔짝뛸 노릇이었다.. 로그에 혹시 뭐 없나.. 좀 주의깊게 보고자 스프링부트 프린팅이 출력되고 나서 한가지 문구가 출력되는 현상을 보았는데.. 아래와 같다.! Please verify your network configuration (macOS machines may need to add entries to /etc/hosts). 네트워크 설정과정에서..
안녕하세요. 오늘은 @ConfigurationProperties 어노테이션을 활용하여 스프링의 db 설정을 관리하는 방법을 소개해보겠습니다. https://sas-study.tistory.com/327 [Spring Boot] 스프링부트 @ConfigurationProperties 어노테이션으로 application.properties에서 관리하기 @ConfigurationProperties @Target({ElementType.TYPE, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface ConfigurationProperties { @AliasFor("prefix") String value(.. s..
스프링부트에서 자주 사용되는 객체중에 ObjectMapper 객체가 있습니다. 저는 개인적으로 많이 쓰지는 않지만 Util로 만들어서 Json String으로 만들어서 디비에 저장하거나 혹은 Json String을 특정 객체로 매핑시킬 때 사용하게 되는데요. 이 객체는 사실 기본조건일 때, 스프링 부트에서 직렬화/역직렬화(Serialize, Deserialize)를 담당합니다. 즉, ResponseEntity가 response body를 json으로 직렬화 할때, ObjectMapper가 사용되게 됩니다. 그러나 기본조건으로 java8에서 등장한 LocalDateTime, LocalDate, LocalTime과 같은 객체들을 아래와 같이 직렬화합니다. 기본조건으로 직렬화한 LocalDateTime { "..
안녕하세요. 오늘은 인터페이스와 ConstraintValidator를 활용해서 Enum 타입으로 정리된 Integer 파라미터를 유효성 검사하는 패턴을 공유해보고자 합니다. 상황은 유저를 등록하는 시점이고, 파라미터로 Integer gender라는 값이(0: 남성, 1: 여성) 넘어올 때 아래와 같은 Enum 으로 정리된 클래스가 존재했습니다. Controller Parameter로 매핑될 AddUserInfoParam 클래스 // lombok 어노테이션들.. 생략.. public class AddUserInfoParam { // .. 기타 생략.. private Integer gender; // 남 0 여 1 } GenderType Enum 클래스 public enum GenderType { MALE(..
더욱 RESTFul API를 개발하고있는 코딩하는 흑구입니다. 해당 시리즈의 모든 소스코드는 여기에서 확인하실 수 있습니다. 지난 시간에는 API Validation과 ExceptionHandler를 이용한 예외처리에 대해서 다뤄보았습니다. sas-study.tistory.com/368 [Spring Boot] 게시판 예제를 이용하여 더욱 RESTFul API 개발하기#2 (API Validation, ExceptionHandler) 지난 포스팅에서는 가장 기본적인 API (흔히 Rest라고 부르는)를 만들어보았습니다. Board 객체를 CRUD 기준으로 5가지의 API를 개발해보았는데요. 자세한 내용은 지난 포스팅을 확인해주시면 좋을 것 sas-study.tistory.com 그리고 마지막에 숙제로 7..