2023년 12월 개발일지
오랫동안 묵혀왔던 블로그를 조금 개편했다. 거창하게 개편이라고 말하였지만 프레임워크를 바꾼다거나 Github Page를 다른 곳으로 변경한 것은 아니었다. 단지 블로그 글과 회고글을 구분하여 이제 더이상 회고글이 블로그 Home에 노출되지 않도록 변경하였다.
이전에 책 제목이 정확하게 기억나진 않지만 개발관련 서적에서 개인 블로그를 운영할 때 개인적인 일기를 블로그에 적지말라는 조언을 본적이 있다. 기술적인 문제점을 해결하거나 인사이트를 얻기위해 기술블로그를 찾아왔는데 개인적인 일기로 도배되어 있다면 다시는 그 블로그를 찾지 않을 것이라는 이야기었다.
한달에 한번 그리고 일년에 한번씩 작성하는 나의 개발일지는 기술적인 이야기를 다루기도하지만 나의 개인적인 이야기도 다루고 있다. 그래서 책에서 말한 조언에 따르면 내 블로그에는 좋은 영향을 미칠만한 글들은 아닌것이다. 그럼에도 불구하고 개발 일지가 작성될 때마다 피드에 업데이트 되면 사용자가 더이상 방문하지 않게될 가능성이 클 것이라 생각이 들었다.
사실 처음에 개발 블로그를 작성하기 시작했을 때에는 게시글이 많지 않아서 어떤 글이라도 노출해서 블로그 글이 풍부하게 보이도록 하는 것이 목적이 었다. 하지만 이제 어느정도 기술 이야기도 많이 작성되었기에 더이상 회고글을 피드에 노출시킬 필요는 없다고 생각이 들었다. 그래서 회고글은 계속해서 작성하되 피드에는 더이상 노출되지 않도록 변경하였다.
아마도 당분간은 2023년 12월은 나에게 가장 큰 기쁜날도 그리고 가장 큰 슬픈날도 함께 있는 그런 달로 기억될 것 같다. 12월 초 우리에게 아주 작은 친구가 찾아왔다. 6년의 결혼동안 미루고 미루었던 숙제를 풀기 시작하였는데, 너무나 반갑게도 아주 빨리 숙제를 풀 수 있게 되었던 것이었다. 그동안 막연한 두려움과 걱정으로 애써 외면했던 행복들이 한꺼번에 찾아오면서 한동안 하루하루 정말 행복하게 지냈던 것 같다.
너무 서둘러 찾아오느라 무언가를 놓고 왔을까. 갑작스레 찾아왔던 우리의 작은 친구는 돌연 그 물건을 찾으러 돌아가 버렸다. 아내는 그 작은 친구가 되돌아 갈 것을 눈치챘던 것 같다. 가장 미안했던건 그 친구가 돌아갔다는 소식을 듣기 전까지 아내의 힘듦을 이해해주지 못하고 애써 외면해왔던 것이었다. 얼마나 외롭고 슬펐을까.
강인한 아내는 오히려 작은 친구의 소식을 듣고 힘들어하는 나를 달래주었다. 처음으로 내 스스로의 노력으로 할 수 없는 것이 있다는 것에 대한 무력감과 공감능력이 떨어지는 내 자신에 대한 원망을 많이 했던 것 같다.
아마도 그 작은 친구는 잊어버린 물건을 찾앋 다시 우리에게 찾아올 것이다. 그때는 좀 더 준비된 모습과 건강한 모습으로 맞이할 수 있도록 몸과 마음을 수련해야겠다고 다짐해본다.
전세 만기가 다되어서 이제는 더이상 지금 사는 집에서 살기 힘든 상황이라 이사를 하기로 결정했다. 아내가 이번에는 꼭 아파트로 이사를 가고 싶다고 해서 가장 먼저 서울에 우리가 갈 수 있는 조건의 아파트들을 찾아보기 시작했다.
처음에는 강동쪽을 찾아보았는데, 아무래도 서쪽지역보다 교통이 쾌적하고 대부분이 평지라 지내기에도 좋다는 판단이 들어서이다. 하지만 역시나 우리가 좋다고 생각하는 조건이라면 남들도 똑같이 좋아하는 조건인가보다. 우리가 가능한 가격대의 아파트는 정말 오래되거나 입지, 교통 등이 부족할 수 밖에 없는 조건의 아파트만 볼 수 밖에 없어서 우리는 어쩔 수 없이 봉천동으로 눈을 돌렸다.
봉천동은 강동보다는 가격이 그나마 괜찮았다. 비슷한 조건이라면 1억정도 차이가 났던걸로 기억한다. 또한 2호선 라인이라 복잡한것만 빼면 오히려 교통은 더 좋을 것이라고도 생각이 들었다. 하지만 가격이 저렴한덴 역시나 이유가 있었다. 봉천동에 위치한 저렴한 아파트는 언덕진 곳에 위치하는 곳이 많았다. 그래서 혹여나 눈이라도 오는날엔 차나 택시를 이용하기에는 무리가 있어보이는 곳도 상당히 있었다. 그나마 적당한 곳에 위치하면 여지없이 가격이 비쌌다.
이삿집을 알아보면서 조금더 돈을 모을껄 하는 후회를 많이했다. 워낙 집값이 비싸서 조금 아낀다고 크게 달라지진 않았겠지만 아쉬운 마음이 드는건 어쩔 수 없었다. 그리고 집을 알아보면 볼수록 내가 생각하기에 전세는 너무 미래에 도움이 되지 않는다는 생각이 들었다. 매매를 하면 집값이 오를 수 있다는 희망이라도 있지만 전세는 그런 희망도 없이 이자비용만 지불하며 삶을 연명하는 느낌이 들었다.
그래서 결국 우리는 천안으로 이사를 가기로 결정하였다. 비록 교통은 상당히 불편해지지만 우리가 그동안 보아왔던 아파트 전세가격의 반도 안되는 가격으로 좀더 쾌적하고 넓은 곳에서 살 수 있었다. SRT 비용을 합치더라도 한달에 나가는 고정비용을 아낄 수 있었다. 그 돈을 아껴 모아서 몇년뒤에 차라리 집을 사는게 낫다는게 우리의 결론이었다.
결론적으로는 이 글을 쓰고 있는 지금 정말 천운으로 청약에 당첨되어서 우리의 선택이 아주 탁월한 선택이 되었다. 청약에 당첨되는 스토리도 적을게 많은데 이 이야기는 1월 개발일지에서 적어보겠다.
아래는 12월동안 정리한 이슈 내용들이다.
RDS PostgreSQL 메이저 버전 업그레이드
올해 상반기에 AWS에서 현재 우리가 사용중인 RDS의 PostgreSQL 11버전을 더이상 지원하지 않는다는 메일을 받게되어서 작업 계획을 세웠었다. 그리고 12월 드디어 PostgreSQL의 메이저 버전을 11에서 15로 업그레드 하는 작업을 진행하게 되었다.
먼저 테스트/QA 환경에서 업그레이드 테스트를 한주동안 진행해보고 사용자가 가장 적은 주말 새벽에 운영 서버의 데이터베이스 버전을 업그레이드 하는 순서로 진행하였다.
현재 우리회사는 대부분의 인프라를 테라폼으로 관리한다. RDS도 테라폼으로 관리하고 있는데 이번에 테라폼으로 RDS의 메이저 버전을 업그레이드 하니까 RDS의 파라미터 그룹을 갱신할 때 문제가 발생하였다. 결국 테라폼으로 RDS의 메이저 버전을 업그레이드 하진 못하고 AWS 콘솔에서 직접 업그레이드 해준 후 테라폼의 상태를 동기화 시켜주는 형태로 진행할 수 밖에 없었다.
추가로 RDS의 메이저 버전을 업그레이드할 때 레플리카는 자동으로 업그레이드 되지 않는다. 그래서 업그레이드 할때 레플리카는 지웠다가 업그레이드 완료 후 새롭게 레플리카를 생성해주는 작업을 해주어야 한다.
fetch, get, retrieve 뜻 비교
개발을 하다보면 라이브러리에서 데이터를 조회한다는 느낌을 주는 이름으로 fetch
, get
, retrieve
라는 단어를 많이사용하고 있는것을 볼 수 있다. 그래서 이 단어들의 차이를 좀더 명확하게 구분한 글이 있어 적어본다.
fetch
가서 어떤 것 또는 어떤 이를 다시 가져오는 것
라는 의미로 해석할 수 있는데 take
가 유사한 의미로 사용된다. 즉, 스스로 직접 가져온다라는 느낌을 준다.
get
무언가를 얻거나 받는 동작
이라는 의미로 해석된다. 즉, 누군가(혹은 무언가)로부터 받는다는 느낌을 준다.
retrieve
무언가를 찾아 다시 가져다 놓는 동작
이라는 의미로 해석된다. 즉, 스스로 무언가를 찾아서 그것을 다시
가져온다는 느낌을 준다.
DGS generateKotlinClosureProjections
옵션
DGS에서 generateKotlinClosureProjections 옵션을 제공하면서 필드리졸버를 별도로 구현하지 않고도 entity의 lazy loading을 활용할 수 있게되었다.
// build.gradle.kts
tasks.withType<GenerateJavaTask> {
packageName = "com.spoqa.cart.generated"
kotlinAllFieldsOptional = true
language = "kotlin"
generateKotlinNullableClasses = true
generateKotlinClosureProjections = true
typeMapping =
mutableMapOf(
"UUID" to "java.util.UUID",
"Decimal" to "java.math.BigDecimal",
"ID" to "java.util.UUID",
"Time" to "java.time.LocalTime",
"DateTime" to "java.time.OffsetDateTime",
"Date" to "java.time.LocalDate",
)
}
FooField(
id = id,
name = name,
lazyProperty = { lazyProperty },
)
다만 이렇게 바뀌면서 DataClass를 활용하지 못한다는 단점이 생긴다.