그 외 공부

서론 사내에서 나를 포함한 소수의 사람들에 의해 Spring Boot 3 버전대의 도입이 서서히 준비가 되면서, 관련 의존성이 있는 모듈 및 프로젝트 역시 새 버전과 호환시켜주는 작업이 필요했다. 사실 사내에서 유용하게 사용되고 있는 공통 모듈들은 우리 팀에서 만든 것들이 많았는데, 대부분 내가 직/간접적으로 참여했다거나 혹은 본인이 부트 3 버전 도입에 적극적으로 임한 것을 이유로 어쩌다보니 거의 대부분 내가 하고 있게 되었다. 😂 (물론 너무 좋은 경험이기도 하다) 정식 마이그레이션 가이드를 기반으로 연관있는 클래스들의 변경사항을 참고하여 작업을 진행했고, 와중에 놓친 것들이 있으면 발생하는 예외 로그를 통해 확인하면서 하나씩 고쳐갈 수 있었다. 하지만, 오류 발생 원인을 찾기 힘들었던 상황도 많았고..
문제 상황 사내 프로젝트의 스프링 부트 및 자바 버전을 업데이트하면서 Deprecated된 클래스들 또한 새롭게 업데이트하고 있었다. 그 중, Spring Security의 WebSecurityConfigurerAdpater가 스프링 부트 2.7 버전부터 Deprecated 되었고 이를 대신해 SecurityFilterChain을 사용하도록 권고했다. 교체하는 것 자체는 어렵지 않았다. 기존 WebSecurityConfigurerAdpater를 상속하는 것 대신 SecurityFilterChain 빈을 등록해주면 되는 형태였다. // 기존 @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override p..
문제상황 실서버에서 Deadlock이 발생했다는 리포트가 올라왔다. Deadlock found when trying to get lock; try restarting transaction 로그를 확인해보니 1초 이내의 짧은 시간 동안 동일한 벌크성 POST 요청이 두 번 연속으로 들어왔다. 아마 우리 서버를 사용 중인 모바일 UI상에서 따닥 두 번 클릭을 한 모양이다. 원인 분석 코드단에서 먼저 분석했을 때, 데드락을 유발한 코드는 아래와 같았다. public void updateMailboxId(String mailboxIdToUpdate, List mailNoList) { jpaQueryFactory.update(mail) .set(mail.mailbox.id, mailboxIdToUpdate) .w..
멀티모듈 프로젝트를 구성하기 위해 프로젝트 패키지 루트 경로의 settings.gradle 파일에 각 프로젝트 디렉토리를 설정해줘야했다. 내가 만든 구조는 아래와 같았다. - boot - api-server - batch - kafka - core - domain - persistence 루트 패키지를 기준으로 쭉쭉 모듈들이 존재하는게 아니라 성격이 비슷한 모듈들을 하나의 디렉토리 내에 모아놓은 형태였다. 루트 패키지 내에 바로 존재하는 모듈을 include해주기 위해선 include 'foo' 처럼 해주므로, 느낌상 특정 디렉토리 하위에 있는 프로젝트는 include 'foo:bar' 처럼 해주면 될 것 같았다. 그래서 아래와 같이 설정했다. // settings.gradle rootProject.n..
메일 서버 동작 구조 메일이 송신자를 떠나 최종 수신자에게 도달하는 대략적인 구조는 위 그림과 같다. 먼저, 송신자는 메일 송신 프로토콜인 SMTP를 통해 메일 데이터를 메일 발신 서버인 abc.com에 전송한다. 메일을 받은 abc.com은 메일 데이터에 포함된 수신자의 메일 서버의 IP를 DNS를 통해 조회하고, 동일하게 SMTP를 사용해 데이터를 해당 서버에 전송한다. 이렇게 전송된 데이터는 메일 수신 프로토콜인 POP3 혹은 IMAP를 사용해 최종 수신자에게 전달된다. 메일 송수신에 사용되는 프로토콜 1) SMTP (Simple Mail Transfer Protocol) 메일 송신을 위해 사용되는 프로토콜 사용 케이스 메일을 송신하고자 하는 사용자가 MTA(Mail Transfer Agent)를 ..
문제 상황 엔티티의 속성을 수정, 저장 후 수정사항이 반영되었는지 확인하기 위해 재조회할 때 변경 내용이 반영되지 않은 채로 데이터가 조회되는 상황이 발생했다. 보다 구체적을 설명하면, 엔티티를 Soft delete하고 난 후 Repository를 통해 다시 해당 객체를 조회했을 때, 조회가 되지 않도록 @Where 처리를 해놓았으나, 실제론 해당 데이터가 여전히 조회됐다. // Book 엔티티 @Getter @Entity @NoArgsConstructor(access = AccessLevel.PROTECTED) @Where(clause = "state != 'DELETED'") public class Book { @Id @GeneratedValue(strategy = GenerationType.IDEN..
문제 상황 스프링 + JPA에 MySQL을 연결해 사용하는 상황에서 “Group”이라는 엔티티를 정의한 후, yml 파일의 jpa.hibernate.ddl-auto 설정을 create로 하여 엔티티 정보에 따라 테이블을 jpa가 자동으로 생성하도록 처리해주었다. spring: jpa: hibernate: ddl-auto: create # 테이블 자동 생성 database-platform: org.hibernate.dialect.MySQL5InnoDBDialect database: mysql 하지만 서버를 켰을 때, SQL syntax error로 인해 “group” 테이블을 생성하는데 실패했다는 메시지를 뿜으며 테이블이 제대로 생성되지 않았다. org.hibernate.tool.schema.spi.Com..
오늘 오전 미뤄놨던 MAC OS Monterey 업데이트를 한 후, 진행 중인 프로젝트의 로컬 서버를 가동하려는데 얘가 갑자기 가상환경에 설치된 패키지들을 읽어들이지 못했다. ModuleNotFoundError: No module named 'decouple' pip freeze를 해도 패키지를 읽어들이지 못했고, git도 정상적으로 작동하지 않았다. 아마 git이 작동하지 않으니 패키지들 또한 정상적으로 불리지 못하는 상황인 것 같았다. 자세히 보니 터미널에 xcrun: error: invalid active developer path 라는 에러가 찍혀있었고, 검색해본 결과 매번 OS 업데이트 직후 빈번히 발생하는 문제란다. 해결방법은 생각보다 간단했다. xcode-select --install 터미널..
SeongOnion
'그 외 공부' 카테고리의 글 목록 (2 Page)