Spring/Spring

    스프링부트 공유라이브러리 만들고 jitpack으로 배포하기 - 2편

    스프링부트 공유라이브러리 만들고 jitpack으로 배포하기 - 2편

    스프링부트 공유라이브러리 만들고 jitpack으로 배포하기 - 1편 스프링부트 공유라이브러리 만들고 jitpack으로 배포하기 - 2편 깃허브 주소 : https://github.com/Sangyong-Jeon/practice_core-service 3. 모든 서비스에 공유할 클래스 만들기 저는 Filter를 만들겠습니다. 이 필터는 요청이 들어오면 콘솔창에 log를 남깁니다. 공유할 클래스를 만드시면 됩니다. 4. 라이브러리 jar 파일로 만들기 위한 준비작업 실행가능한 jar 파일로 빌드하지 않도록 빌드 시스템을 비활성화시키는 작업. 이 작업에서 SpringBootPlugin 비활성화하여 bootJar도 비활성화하고, 실행가능한 jar로 빌드할 수 없게 설정함. 스프링부트 의존성 관리를 위해 bom을..

    스프링부트 공유라이브러리 만들고 jitpack으로 배포하기 - 1편

    스프링부트 공유라이브러리 만들고 jitpack으로 배포하기 - 1편

    스프링부트 공유라이브러리 만들고 jitpack으로 배포하기 - 1편 스프링부트 공유라이브러리 만들고 jitpack으로 배포하기 - 2편 깃허브 주소 : https://github.com/Sangyong-Jeon/practice_core-service 작성 이유 SpringBoot(스프링부트)와 Gradle, Java로 라이브러리 만드는 자료가 많이 없었음 Maven은 꽤 있었으나 Gradle은 많이 안보였음 JitPack 으로 배포하는 방법도 있기는 했으나 나에겐 잘 안되던 것들이었음 시행착오를 많이 겪었던 부분이라 기록으로 남겨서 추후에도 사용하기 위함 기술 사양 Java 17.0.2 - Zulu SpringBoot 3.2 IntelliJ Github 간단한 동작 설명 공유 라이브러리(core-ser..

    Spring Cloud Config Client에서 actuator refresh 장애

    Spring Cloud Config Client 에서는 Config Server의 변경된 설정정보를 받기위해서는 actuator refresh 방법으로 설정정보를 갱신할 수 있다. 그런데 아무리 refresh를 해도 변경된 설정정보가 갱신이 안되는 장애를 겪었다. 아무리 살펴봐도 application.yml에 잘못적은 것이 아닌데 무엇이 문제인가 생각하다가 bootstrap 라이브러리때문인 것을 알게되었다. 🚀 상황 Spring Cloud Config Server에서 변경된 설정정보를 받으려고 Actuator refresh API 호출함 refresh API 호출하였지만 설정정보가 갱신되지 않음 🚀 문제해결 Spring Cloud Config 공식홈페이지에서 Spring Cloud Config Clien..

    로컬에서 동일한 SpringBoot 서버를 여러개 실행하는 방법

    로컬에서 동일한 SpringBoot 서버를 여러개 실행하는 방법

    스프링부트 1개의 서버를 로컬에서 여러개 띄워야하는 경우에는 여러 방법을 통해 실행할 수 있다. 🚀 IDE(통합개발환경) 사용하기 IntelliJ(인텔리제이)에서는 서버 옵션을 편하게 설정할 수 있다. 나는 인텔리제이 2022.2.3(Ultimate edition) 버전을 사용하고 있음. 1. 수동으로 포트번호 설정하기 인텔리제이 버전마다 다르지만 내가 사용하는 버전에서는 [옵션 수정] 버튼을 눌려서 VM 옵션을 추가해야 보인다. -Dserver.port=포트번호 VM 옵션에서 [포트번호적기]에 원하는 포트번호를 적으면 해당 포트번호로 서버가 실행되게 된다. 만약 "-Dserver.port=1234" 를 적었으면 1234 포트번호로 서버를 실행시킨다는 의미이다. 참고로 복제한 것에 이름은 바꿔주고 [적용..

    SpringBoot 랜덤포트로 실행하기

    🚀 상황 1개의 SpringBoot 서버를 여러개로 실행해야 함 따라서 포트번호를 서버마다 다르게 지정해야 함 수동으로 지정하는 것은 매번 관리하는 것이 어려움 🚀 해결 방법 server: port: 0 application.yml 또는 application.properties 에서 SpringBoot 서버 포트를 랜덤으로 사용하겠다고 설정 위 예시코드는 yml 이러면 포트가 중복되어도 해당 포트를 우회하여 다른 값을 설정하게 됨

    선착순 쿠폰 발급을 위한 redis 분산락

    선착순 쿠폰 발급을 위한 redis 분산락

    선착순 쿠폰 발급을 위한 백엔드 시스템을 구현한 코드는 깃허브에서 볼 수 있다. 🚀 요구사항 멀티 서버 선착순 쿠폰 발급 중복 발급 X 짧은 시간 대용량 트래픽 발생 🚀 구현 기술스택 Language : Java 11 Framework : Spring Boot 2.7.8 Database : MySQL 8.0, JPA, QueryDSL, Redis API Documentation : Swagger 3.0.0 🚀 해결 방법 1. DB Exclusive Lock(배타적 잠금) JPA Pessimistic Lock(비관적 락)을 이용하여 DB에 배타적 잠금 사용 다른 트랜잭션에서 읽기, 수정, 삭제 방지 SQL을 보면 select for update 구문을 사용하는 것을 볼 수 있음 @Lock(LockModeT..

    트랜잭션을 사용할 때 각 DB들의 기본 격리 수준은 무엇일까?

    트랜잭션을 사용할 때 각 DB들의 기본 격리 수준은 무엇일까?

    스프링 프레임워크를 사용한다면 @Transactional 을 Service단에 붙여서 자주 사용할 것이다. 이 경우 아래와 같이 isolation (격리수준)이 default(기본값)으로 지정된다. @Transactional의 옵션인 isolation의 기본값은 Isolation.DEFAULT 라고 한다. 그렇다면 Isolation.DEFAULT란 무엇일까? 우선 Isolation은 TransactionDefinition 인터페이스에 해당하는 Transactional 어노테이션과 함께 사용할 트랜잭션 격리 수준(transaction isolation levels)을 나타내는 열거형(Enumeration)이다. 열거형 값은 다음 5가지가 있다. DEFAULT READ_UNCOMMITTED READ_COMM..

    포스트맨으로 url 요청했는데 405 에러

    포스트맨으로 url 요청했는데 405 에러

    비대면으로 하다보니 원격으로 에러를 고치는 상황이 많은데 역시 화면공유가 제일 빨리 에러를 찾을 수 있는 것 같다. 이번에는 api가 잘 작동하는지 요청을 해보았는데 405 에러가 뜬다고 한다. 포스트맨으로 하면 이렇게 에러 내용을 보기 편하게 만들어줘서 이게 좋은 것 같다. 브라우저는 이렇게 뜨긴 하지만 초보자한테는 포스트맨이 더 좋아보인다..! 포스트맨의 에러 내용을 살펴보면 HTTP 상태코드 405인 Method Not Allowed이다. 메서드가 허용되지 않았다고하며 'GET' 메서드를 지원하지 않는다고 한다. 그리고 해당 경로는 "/api/posts" 이기 때문에 이 메서드를 살펴보면 된다. 위에서는 GET으로 요청했지만 만든 것은 POST 였기 때문에 해당 405 에러가 뜬 것이다. 빠른 해결..