트렌비에서는 대부분의 서버가 분산된 EKS 환경에서 운영되고 있습니다. 하지만, 새로운 프로젝트를 만들 때에 분산 환경을 위한 분산 락 설정을 매 번 추가해주어야 하는 번거로움과 레거시 시스템에서는 분산 환경을 충분히 고려하지 못한 경우가 있어 동시성 문제가 발생하는 경우가 종종 있었습니다. 이를 해결하기 위해, 사내 공통 분산 락 라이브러리를 개발하자는 아이디어를 팀장님에게 제안하였고 자유롭게 만들어 볼 수 있는 기회를 주어서 제작해보게 되었습니다. 분산 락Java와 Kotlin에서는 Monitor 인터페이스로 ReentrantLock, synchronized 키워드 등을 통해 락을 관리할 수 있습니다. 하지만 이러한 방식은 인메모리에서만 작동하여 분산 환경에서는 적용하기 어렵습니다. 예를 들어, 클라..
Postman을 사용하여 스프링의 @ResponseBody로 api 통신을 하고 있던 와중에 다음과 같은 오류를 겪게 되었다. Error parsing HTTP request header Invalid character found in method name HTTP method names must be tokens 대충 에러를 보면 HTTP 요청헤더에 뭔가 잘못되었다고 하고 HTTP 메서드 이름에서 유효하지 않은 문자가 발견됐다는 것이다. 그리고 토큰화 되어야 한다고 한다. 먼저 헤더부터 살펴봤다. Content-type도 application/json으로 일치하고, Accept는 따로 설정하지 않았으니까 별 문제가 없을 것이고 Connection 또한 tcp 연결을 time-out 만큼 유지하고, ma..
Aspect의 등장 이유 스프링 AOP는 부가 기능 추가시 횡단 관심사로 인한 문제 때문에 등장하게 되었다. 만약 횡단 관심사를 객체 지향적으로 해결하기 위해서는 많은 문제들이 발생한다. 부가 기능을 적용할 때, 부가 기능을 적용하기 위한 코드를 작성해주어야 한다.(템플릿 적용 전) 부가 기능이 여러곳에 퍼져서 중복 코드를 만들어 낸다. (적용 이후에도 동일) 부가기능 변경 시 많은 부분을 수정해야 한다. (제대로 된 캡슐화가 되지 않음) 부가기능 적용대상 변경 시 많은 수정이 필요하다. (적용하지 않을 대상들을 직접 찾아야 함.) 이러한 문제점을 해결하기 위해 핵심 로직과 부가 기능 로직을 나누고, 부가 기능을 어디에 적용하고 어떤 부가 기능을 적용할 지 선택하는 기능을 합한 하나의 모듈로서 등장한 것..
빈 후처리기라고 얘기를 하면 먼저 떠오르는 것은 @PostConstruct가 떠오를 것이다. 빈을 초기화하는데에 있어서, 초기화 이후 어떠한 작업을 추가해서 하기 위한 애노테이션인데 이 또한 빈 후처리기에 속한다. 오늘은 스프링의 빈 후처리기가 무엇인지 살펴보자. Bean PostProcessor(빈 후처리기) 빈 후처리기란 빈 저장소에 사용될 목적으로 생성할 객체를 빈 저장소에 등록되기 직전에 조작하는 것이다. 따라서, 빈 객체가 스프링 컨테이너에 등록되기 전에 저장 될 객체를 다른 객체로 바꾼다거나, 프록시를 적용한다거나 여러가지가 가능하다. 빈 후처리기 적용 과정 빈 후처리기의 적용 과정은 크게 4가지로 구분 할 수 있다. 1. 생성 : 스프링 빈 대상이 되는 객체를 생성한다. 2. 전달 : 생성된..
이전에 템플릿 메서드 패턴 포스팅에서 JdbcTemplate가 템플릿 메서드 패턴을 개선한 전략 패턴과 이를 이용한 스프링의 템플릿 콜백 패턴을 통하여 구현이 된다고 포스팅을 했었는데, 오늘은 그 템플릿 콜백 패턴이 어떻게 구성되는지 알아보는 시간입니다. JdbcTemplate 말고도, TransactionTemplate, RedisTemplate 등등 많은 부분에서 활용되기 때문에 해당 패턴을 이해하고 나면 이제 그림이 그려지실거라 생각합니다. 그럼 들어가기에 앞서서 먼저 콜백에 대해서 알 필요가 있습니다. 콜백이란? 프로그래밍에서 콜백(callback) 또는 콜애프터 함수(call-after function)는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백..
스프링의 동시성 문제와 해결 스프링은 기본적으로 빈을 등록할 때, 싱글톤 패턴으로 스프링 컨테이너에 하나의 객체만 가지고 있는 형태를 띄고 있다. 하나의 객체만을 가지고 있기 때문에, 톰캣같은 WAS는 멀티 쓰레드를 지원하기 때문에, 하나의 객체에 여러 클라이언트들이 접근을 하게 되었을 때, 데이터의 변경이 발생한다면 동시성 문제가 발생한다. 동시성 문제란 동시성 문제는 임계 영역에 각기 다른 쓰레드가 동일한 데이터에 접근하고 어떠한 쓰레드가 임계 영역의 데이터를 변경하려고 할 때 발생을 하게 되는데, 임계 영역이란 어떠한 자원을 공유할 수 있는 공간을 말한다. 따라서, 우리가 코드를 사용할 때, 임계영역이 발생할 수 있는 부분은 static 변수를 선언하거나 혹은 싱글톤 패턴으로 인해 새로운 객체의 생..
때때로 스프링 프로젝트에서 테스트 패키지의 테스트 메소드에서 롬복을 사용하려고 하는 경우가 있다. 하지만 main 패키지에서는 잘 되는데 test 패키지에서는 안되는 경우가 종종 발생한다. build.gradle 에 다음과 같은 내용을 추가해주어야 한다. dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' testImplementation 'org.springframework.boot:spring-boot-starter-test' // 아래에 testCompil..
mac m1 에서 sts4 설치 후 어느 날 springtoolsuite4 응용 프로그램을 열 수 없다는 경고창이 나왔다. 검색해보니 맥 자체의 인증 문제라고 한다. codesign --force --deep --sign - /Applications/SpringToolSuite4.app 을 터미널 or iterm2에 입력하게 되면 인증이 되고 재 실행을 하니 문제가 해결되었다. https://happy-jjang-a.tistory.com/104ㅇㅇ MAC 응용프로그램을 열 수 있는 권한이 없습니다 MAC에서 STS 사용중에 갑자기 아래와 같은 문제가 발생하여 STS를 실행할 수 없을 때 조치 먼저 pkgutil로 인증 상태 확인 pkgutil --check-signature /Applications/Sp..