Thinking

2022년 짧은 회고

시간이 빠르다는 말을 달고 살았던 2022년이었다. 오래 몸 담았던 대학교를 떠났고 일하고 싶었던 회사에서 새로운 시작을 했다. 많은 사람, 공간, 환경이 변했고 그 변화 속에서 스스로에게 몰랐던 모습을 발견하기도 했으며 많은 부분이 변하기도 했다. [1] 먼저 지난 대학 생활이 떠오른다. 8월에 졸업 사진을 찍는 것을 마지막으로 대학 생활의 마침표를 찍었다. 긴 시간동안 많은 사람들을 만났고 그 사람들과 공유했던 시간과 공간들이 아직까지 기억에 많이 남는다. 회사 생활을 하며 이전보다는 자주 연락하거나 만나지는 못하지만 가끔씩 만나서 서로의 근황에 대해 이야기하고 옛날 이야기를 하는 것들이 더 재밌고 의미있게 느껴진다. 대학 생활을 돌아보면, 주변에는 항상 대단한 사람들이 많았던 것 같다. 자신이 꿈꾸..

2023.01.02 게시됨

Data Engineering

파이썬 스크립트로 Kafka Partition Reassign 자동화하기(Kafka URP 대응기)

1. 배경 팀에서 운영하고 있는 서비스들은 카프카를 통해 비동기 이벤트들을 처리하고 있습니다. 그런데 해당 카프카들을 담당하는 Ceph 분산형 스토리지의 불안정성으로 인해 가끔씩 몇 가지 토픽에 대한 파티션들이 복제를 제대로 수행하지 못하는 이슈가 간헐적으로 발생했고, 특히 어느 시점에는 이러한 복제 장애가 지속되어 일일이 누군가 카프카 매니저에서 직접 파티션을 재할당해주는 방식으로 대응해야만 했습니다. 이 과정은 사람이 수동으로 대응해야 한다는 불편함 + 새벽 시간에 장애가 발생하면 대응 자체가 까다롭다는 문제가 있었습니다. 그래서 수동으로 파티션을 재할당해주는 과정 자체를 스크립트화하여 자동으로 URP 장애를 대응할 수 있게 했던 경험을 기록해보려고 합니다. 2. URP URP(Under Replic..

2022.12.14 게시됨

Spring & Springboot

Spring Bean VS StaticClass

Spring bean과 Static 함수의 생성 시점은 아래와 같습니다. [1] Spring bean : JVM 로드 → Tomcat 실행 → Component Scan 시점 [2] StaticClass Method : JVM에서 클래스가 메모리에 올라가는 시점 이 사실을 보면 Spring Bean 생성 시점보다 StaticClass 내부의 Method 생성 시점이 앞선다는 것을 알 수 있습니다. 뿐만 아니라, Spring bean과 StaticClass의 Method 모두 싱글톤을 보장한다는 점에서 공통점을 가집니다. 그렇다면 'Spring Bean을 대체해서 StaticClass를 정의해서 사용해도 될까'하는 의구심(?)이 스쳐지나가는데요. 이번 포스팅에서는 둘 사이의 차이점에 대해 짚어보고 어떤 상..

2022.12.10 게시됨

Thinking

개발 블로그를 시작한 지 500일이 지나고

블로그 누적 방문자 수가 50,000명이 넘었다. 그리고 블로그를 시작한 지는 500일이 조금 지났다. 삭제한 글을 포함해서 가장 최근에 쓴 Spring AOP 스터디 - (3) 글이 520번째 글이니 그동안 그대로 성실하게 블로그를 써왔던 것 같다(취업 준비를 하면서 알고리즘 풀이를 올렸던 글들이 많았고 이 글들은 대부분 삭제했지만). 처음부터 지금까지 개발 블로그를 하는 이유는 크게 두 가지였다. (1) 일차적으로는 내가 공부한 내용을 기록하기 위해 (2) 이차적으로는 내가 공부한 내용이 여기까지이며 나는 이정도까지 알고 있다는 자기 효능감을 갖기 위해 하지만 지난 글들을 볼 때마다 드는 생각은 비슷했다. 나는 왜 이렇게밖에 설명하지 못하는지 내가 남들은 다 알 것 같은 내용을 블로그에 기록하는 건 ..

2022.11.26 게시됨

Spring & Springboot

Spring AOP 스터디 - (3) 프록시 객체의 내부 메서드 호출 문제

1. 문제 이번 글에서는 Spring AOP를 공부할 때 반드시 알아야 할 프록시 객체의 내부 메서드 호출 문제에 대해 다뤄보려고 합니다. 테스트 환경을 만들기 위해 이전 글에서 작성했던 예제 코드 일부를 조금 수정해보겠습니다. [UserService.java] @Service @RequiredArgsConstructor @Import(PerfAspect.class) public class UserService { private final UserRepository userRepository; public void save(User user) throws UserAlreadyExistException{ if(isAlreadyExistUser(user)){ throw new UserAlreadyExistE..

2022.11.20 게시됨

Java & Kotlin

[JAVA] JDK 17에서 제공하는 새로운 기능들 정리해보기

1. 빨라진 JDK Release 작년 9월, JDK 17이 최초로 공개되었고 바로 얼마 전에는 JDK 19 버전이 출시되었습니다. 비록 JDK 19가 LTS 버전은 아니지만, 내년 하반기에는 JDK 21 LTS 버전이 출시된다고 하는데요. 과거에는 JDK 버전업과 LTS 버전의 출시가 굉장히 큰 간격을 두고 이루어졌지만, 최근 들어 자바 진영에서는 새로운 JDK 버전의 Release를 공격적으로 가져가고 있습니다. 이렇게 변화의 속도가 빨라진 요즘, JDK에서 제공하는 기능들은 무엇이 있는지 이해하고 필요에 따라 적절히 사용하는 것은 기술 부채의 관점에서 개인이나 팀에게 굉장히 중요한 요소라고 생각합니다. 그래서 이번 글에서는 JDK 17 LTS 버전에서 제공하는 기능 몇 가지에 대한 예제 코드를 작성..

2022.11.18 게시됨

Git

작업 중인 브랜치에 다른 히스토리를 반영해야 할 때: Merge? Rebase?

1. 상황 develop(main) 브랜치 하위에 특정 기능을 구현하기 위한 feature/A 브랜치를 생성했습니다. feature/A 브랜치에서 몇 차례 Commit을 진행하고 Push 해둔 상태에서 아직 develop 브랜치에 반영하지는 않았습니다. 한편, 제가 feature/A에서 작업을 하는동안 다른 팀원이 develop 브랜치 하위에 feature/B 브랜치를 생성해서 수정사항을 반영한 뒤, develop 브랜치에서 Merge를 했습니다. 이 때, 저는 다른 팀원이 작업한 develop 변경 사항을 포함하는 동시에 제가 변경한 부분도 반영해서 앞으로의 작업을 이어나가고 싶습니다. * 아래 그림을 두고 설명하자면 feature/a 브랜치의 10~40 부분을 그대로 유지하면서 main의 변경사항 중..

2022.10.31 게시됨

Spring & Springboot

Spring AOP 스터디 - (2) @Aspect 기반 AOP 적용

지난 포스팅에서는 'AOP가 왜 필요한가'에 대해 알아보고 AOP를 이해하는 데 필요한 몇 가지 용어들을 정리했습니다. AOP의 기본적인 개념에 대해 궁금하신 분은 위 글을 참고해주시면 좋겠습니다. 이번 시간은 지난 포스팅에서 문제 삼았던 코드를 AOP 기반으로 수정해보면서 Spring AOP가 동작하는 방식을 이해해보겠습니다. 1. 문제의 코드 지난 포스팅에서 예제로 사용했던 문제의 컨트롤러입니다. @RestController @RequiredArgsConstructor @Slf4j public class UserController { private final UserService userService; @PostMapping("/user") public String userSave(String ema..

2022.10.21 게시됨

Spring & Springboot

Spring AOP 스터디 - (1) AOP의 필요성과 기본적인 동작 원리

0. 들어가면서 이번 글부터는 몇 개의 연재글을 통해 Spring AOP에 대해 공부해보려고 합니다. 벌써 몇 번째 글을 수정하고 다시 쓰고 하는 것 같은데, 그만큼 Spring AOP를 이해하고 설명하는 데는 꽤 시간이 많이 드는 것 같습니다. 어쨌든, 이번 글에서는 Spring AOP의 기본적인 개념과 필요성을 예제 코드로 확인해보고 AOP와 관련된 기본적인 용어를 정리해보겠습니다. 그리고 다음 글에서부터는 예제 코드에 Spring AOP를 적용해보면서 어떻게 코드가 개선될 수 있으며, 이로 인해 얻을 수 있는 장점은 무엇인지 눈으로 확인해보겠습니다. 1. AOP와 객체지향 Aspect-Oriented Programming (AOP)complements Object-Oriented Programmin..

2022.10.18 게시됨

Thinking

어떤 개발자가 될까

사람 생각이 항상 똑같을 수 있을까. 내가 지금까지 가지고 있던 좋은 개발자의 정의가 흔들린다. 이전까지 어떤 개발자가 되고 싶냐고 자문했을 때 내가 답할 수 있는 몇 가지 모습은 이랬다.새로운 기술, 필요한 기술에 관심을 갖고 열심히 배우고자 한다.어떤 코드가 좋은 코드인가에 대해 고민하고 리팩토링하는 것을 당연시 여긴다.설계부터 구현까지의 각 과정을 어떻게 할 것인가에 대해 고민하고 그 이유를 제시할 수 있다.협업의 중요성을 알고 다른 사람에게 열심히 배우고 열심히 알려준다....이런 모습이 내가 되고 싶은 개발자였고 물론 지금까지도 위 생각은 유효하다. 하지만 빼먹은 것들이 보이기 시작했다. 최근에 스타트업을 다니고 있거나 창업을 한 지인들을 만나 이야기하는 시간이 있었다. 자는 시간을 빼놓고는 거..

2022.10.12 게시됨