본문 바로가기

Spring38

백엔드 서비스 운영시 고려해야할 점 지난 한 해 동안 사내에서 신규 서비스를 개발 및 오픈하게 되었습니다.🎉 보통 주니어 개발자는 입사 후 아래와 같은 상황인 경우가 많을 것이라 생각됩니다. 기존 운영되고 있던 서비스를 운영 개인(토이) 프로젝트 개발 -> 때에 따라 실제 서비스 오픈 (하지만 서비스 이용자가 많이 없어 배포까지만 완료하는 경우가 많음) 시니어 개발자가 프로젝트 설정 후 API 개발만을 담당함 저 또한 같은 주니어 개발자 입장이지만 팀 내 프로젝트 개발 표준 구성 데브옵스 & 인프라 구성 를 모두 담당하게 되면서 단순히 API 개발만 했더라면 알지 못하고 넘어갔을 내용들을 정리하여 공유하려 합니다. Java + Springboot 환경을 기준으로 작성합니다👋 요청 당 로그 트레이싱 서비스를 오픈하고 운영하는 단계 또는 그 .. 2024. 1. 21.
ELK 스택을 사용해 Springboot 로그 수집하기 ELK 스택을 사용해 Springboot 로그 수집하기 분산환경을 사용해 서버를 운영하고 있다면, 몇 개 또는 수십개의 서버의 로그를 한번에 보기 힘든 상황이 나타납니다. 예를 들면 터미널을 여러 개로 분할해서 각 서버에 접속 후 로그를 찾는다거나… (제가 그러고 있었죠…) 물론, cloudWatch와 같이 서버의 console에 출력되는 로그의 내용을 한번에 조회할 수 있지만, 이것 또한 불편함이 굉장히 많습니다. 이런 불편함을 해결하고자 미루고 미루던 분산된 Springboot 로그를 ELK스택을 이용해 수집하고, 조회해보고자 합니다. ELK 구축 각각의 서비스의 로그를 수집하는 방법에는 여러가지 방법이 있습니다. 그중 Logstash로 로그를 수집해 ElasticSearch 에 전달, Kibana를.. 2023. 11. 5.
[Spring] ExceptionHandlerLoggedImpl 에러가 나타난다면 ExceptionHandlerLoggedImpl 에러가 나타난다면? 저는 start.spring.io를 이용해 스프링 프로젝트를 생성하고 있습니다. 현재 최신 springboot version은 2.7.3이며, 프로젝트 생성 후 H2DB에 ddl-auto=create 옵션 사용중 이러한 에러를 확인했습니다. GenerationTarget encountered exception accepting command : Error executing DDL 위 에러는 Hibernate 버전과 H2DB 스키마 사이의 에러로 확인되는데 springboot 2.7.3에서 사용하는 Hibernate는 5.6.10 버전입니다. 과거에도 자주 나타났던 에러이고, 최근 진행했던 다른 프로젝트에서 Springboot 2.6.8 .. 2022. 8. 24.
[Spring] AOP Joinpoint의 getThis()와 getTarget() AOP Joinpoint의 getThis()와 getTarget() 김영한님의 Spring 고급편을 수강하면서 수강하시는 분의 질문을 보고 작성하는 포스팅입니다. 커뮤니티의 질문을 보면 aspectj의 joinPoint를 통해 조회한 getThis()와 getTarget()의 결과가 같다는 질문이 있습니다. eclipse aspectJ doc을 확인해보면, getThis()의 경우 현재 실행중인 개체(proxy 객체)를 반환하고, getTarget()의 경우 대상 개체(class 객체)를 반환한다고 나와있습니다. @Around("com.heekng.aop.order.aop.Pointcuts.orderAndService()") public Object doTransaction(ProceedingJoinPo.. 2022. 8. 20.
[Spring] kotlin spring lazy loading 삽질기 Kotlin spring lazy loading 삽질기 kotlin+spring 시작하기에 이어 기존에 만들었던 crud 위중의 프로젝트를 kotlin+spring 프로젝트로 변경하던 중 JPA와 Jackson 그리고 Jpa의 LazyLoading으로 인해 몇 시간 동안 붙잡게 되었습니다. 이를 해결하기 위해 진행했던 방법, 결과적으로 잘못되었던 점에 대해 짚어보려 합니다. allOpen 옵션 열어두기 먼저 kotlin의 open에 대해 알아보면, java와 다르게 kotlin의 클래스는 기본적으로 final으로 설정되어 있습니다. hibernate에서 사용하는 CGLIB는 상속을 기반으로 프록시 기술을 사용하기 떄문에 코틀린 클래스에 대해 상속을 열어두어야 프록시 기술을 사용할 수 있습니다. 기존의 b.. 2022. 8. 13.
[Spring] kotlin + Spring 시작하기 Kotlin + Spring 시작하기 최근 취업 준비를 하며 코틀린에 대한 필요성을 느꼇고, 코틀린을 공부해 보았습니다. 뒤이어 Spring에 Kotlin을 적용해 일명 코프링프로젝트를 시작하기로 했습니다. 버전의 경우 제 현재 프로젝트의 버전이 입력되어 있습니다. 때에 따라 다르게 적용하시면 됩니다. build.gradle - 코틀린 적용 plugins { ... id 'org.jetbrains.kotlin.jvm' version '1.6.21' id 'org.jetbrains.kotlin.plugin.spring' version '1.6.21' ... } dependencies { ... implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk8' implem.. 2022. 8. 10.
[SpringBatch] 멀티쓰레드 Step 멀티쓰레드 Step TOCHE 프로젝트를 진행하면서 대용량 배치 처리를 해야하는 일이 생겼다. 기존의 배치는 chunk 기반의 단순한 배치이다. private Step useDeckStatsStep() { return stepBuilderFactory.get("useDeckStatsStep") .chunk(chunkSize) .reader(useDeckStatsReader()) .processor(useDeckStatsProcessor) .writer(useDeckStatsWriter()) .build(); } 위와 같은 Step을 10개의 쓰레드를 이용해 멀티쓰레드 환경으로 실행해야 했다. private final int poolSize = 10; ... private Step useDeckStatsS.. 2022. 7. 2.
[JPA] illegally attempted to associate proxy with two open Sessions 에러 illegally attempted to associate proxy with two open Sessions 에러 SpringBatch와 Jpa를 사용하면서 illegally attempted to associate proxy with two open Sessions에러를 만나게 됐다. 당연하지만 처음 보는 에러는 정말 당황스럽다. illegally attempted to associate proxy with two open Sessions 에러는 두개 session에서 같은 proxy를 다루려 하면서 나타나는 에러다. public MatchInfo process(MatchInfo matchInfo) throws Exception { initializeUnitsAndAugments(matchInfo);.. 2022. 7. 1.
[Spring] SpringBoot 기본 TimeZone 설정하기 SpringBoot 기본 TimeZone 설정하기 개발을 진행하고, 배포하는 도중 IDE에서는 정상적으로 Asia/Seoul으로 설정되던 TimeZone이 원격 서버에서 정상적으로 설정되지 않음을 알았다. 첫 번째 수정 리눅스 서버 자체의 서버시간과는 별개로 작동하는 것을 확인하였고, Spring 실행 시 argument로 Asia/Seoul으로 설정하도록 했다. java -Duser.timezone=Aisa/Seoul -jar ~~.jar 와 같이 -Duser.timezone을 추가하여 SpringBoot의 기본 TimeZone을 설정하였다. 두 번째 수정 @PostMapping public void setTimeZone() { TimeZone.setDefault(TimeZone.getTimeZone(.. 2022. 6. 13.