전체 글
로컬에서 동일한 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 분산락
선착순 쿠폰 발급을 위한 백엔드 시스템을 구현한 코드는 깃허브에서 볼 수 있다. 🚀 요구사항 멀티 서버 선착순 쿠폰 발급 중복 발급 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..
Swagger 3.0 documentationPluginsBootstrapper 에러 해결하기
🚀 에러 발생 원인 org.springframework.context.ApplicationContextException: Failed to start bean 'documentationPluginsBootstrapper'; nested exception is java.lang.NullPointerException 해당 에러는 SpringBoot 2.6 버전 이후 spring.mvc.pathmatch.matching-strategy 값이 ant_path_matcher에서 path_pattern_parser로 변경되면서 발생하는 오류이다. 따라서 아래와 같이 application.yml 또는 application.properties를 고치면 된다. spring: mvc: pathmatch: matching-..
[Clean Code] 3장 함수
🚀 들어가면서 지금껏 개발하면서 함수(메서드)를 어떻게 만들어야할지 많은 고민을 했었다. SRP(단일책임원칙)을 지켜야하므로 함수는 한 가지 책임만 가지게 만들어 유지보수성을 높여야한다고 하지만 생각과는 다르게 개발이 되었던 경우가 많았다. 예전에 읽었던 책을 빠르게 읽어보면서 다시끔 클린코드를 생각해보자. 어떤 프로그램이든 가장 기본적인 단위가 함수이다. 아래 질문을 가지고 이번 장을 살펴보자. 함수가 읽기 쉽고 이해하기 쉬운 이유는 무엇일까? 의도를 분명히 표현하는 함수를 어떻게 구현할 수 있을까? 함수에 어떤 속성을 부여해야 처음 읽는 사람이 프로그램 내부를 직관적으로 파악할 수 있을까? ✏️ #1, 작게 만들어라! 함수를 더욱 작게 만들수록 좋다 각 함수가 이야기 하나를 표현하여 명확하게 파악할 ..
Decorator(데코레이터) 패턴이란?
🚀 데코레이터 패턴이란? 객체에 추가 요소를 동적으로 더할 수 있는 패턴 데코레이터를 사용하면 서브클래스를 만들 때보다 훨씬 유연하게 기능을 확장할 수 있음 위 그림에서는 구성 요소의 형식으로 Component를 추상 클래스로 만들었는데, 데코레이터 패턴에서는 특정한 추상 구성 요소를 지정하지 않기 때문에 인터페이스를 사용해도 된다. 따라서 기존의 코드 구조가 추상 클래스면 추상 클래스로 진행하고, 아니라면 인터페이스로 만들면 된다. 여기서는 추상 클래스로 생각하고 진행하겠다. ✏️ Component 기본 기능을 뜻하는 추상 클래스 or 인터페이스 데코레이터들은 이 클래스를 상속하고 있기에 서로를 감쌀 수 있음 ✏️ ConcreteComponent 기본 기능(Component)을 구현(정의)하는 클래스 ..
오라클 클라우드 MFA 분실로 인한 로그인 문제
스마트폰을 바꾸면서 기존에 있었던 Oracle Cloud MFA 키를 가져오지 않았다. 키를 이동시키는 방법은 잘 모르니 OCI에 접속해서 MFA 키를 비활성화하거나 대체 로그인을 설정했어야 했다. 하지만 MFA 비활성화도 하지 않고, 대체 로그인도 설정하지 않아서 오라클 클라우드에 로그인 할 수 없었다. 그렇다.. 망한거다...하... 하지만 드디어 오늘 해결이 되었기에 그 과정을 적어보고자 한다. 🚀 문제 발생 우선 계정 이름을 적어 로그인을 시도한다. 여기서도 이메일과 비밀번호를 적어 로그인을 시도한다. 그럼 이제 2차 인증으로 MFA 인증을 해야한다. MFA는 Multi-Factor Authentiacation으로 다중 인증 기능이라고 보면 된다. 이걸 사용하면 내 휴대폰에 설치된 앱을 통해 비밀..
Observer(옵저버) 패턴이란?
🚀 옵저버 패턴이란? 주제(subject)가 변경될 때마다 옵저버(observer)들에게 변화를 알려주는 디자인 패턴 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체에게 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의함 주제와 객체를 따로 두는 경우도 있음. 즉, 주제가 객체를 관찰하다가 변화가 생기면 옵저버들에게 알려주는 것 주제는 옵저버들이 인터페이스를 구현한다는 것을 제외하면 옵저버에 대해 아무것도 모른다. 따라서 이들 사이의 결합은 느슨한 결합(Loose Coupling)이다. 옵저버는 언제든지 새로 추가 및 제거 가능 새로운 형식의 옵저버를 추가할 때도 주제는 변경할 필요 X 주제와 옵저버는 서로 독립적으로 재사용 O 주제나 옵저버가 달라져도 서..