전체 글
-
2023년 6월 2주차 주간 회고주간 회고 2023. 6. 12. 01:31
야크 털 깎기 야크 털 깎기라는 표현을 들어 보았는가? 보통 어떤 목적을 달성하기 위해 일련의 작업들을 수행하는 과정에서 어느 순간 원래 목적과는 동떨어진 일을 하게 되는 것을 나타내는 데 해당 표현을 사용한다고 한다. 세스 고딘의 저서 '이제는 작은 것이 큰 것이다'에는 다음과 같은 사례가 등장한다. (사례는 약간 각색했다.) - 목적: 봄이 왔으니 세차를 한다. - 행동 1. 세차를 하려고 했는데 호스가 터졌다. 새 호스를 사러 마트에 간다. 2. 호스를 사러 가려고 차에 탔는데 차의 기름이 떨어졌다. 옆 집 이웃에게 기름을 빌리러 간다. 3. 우리 아들이 이웃집 막내아들한테서 보이스카웃에 간다고 베개를 빌려갔던 게 생각났다. 베개를 돌려줘야 기름을 빌려줄 것 같으니 아들한테서 베개를 찾아 돌려주기로..
-
[Java] Reflection API란 무엇인가?Today I Learned 2023. 5. 27. 17:36
private 메서드를 클래스 외부에서 억지로 호출할 수 있다고? 이펙티브 자바에서 싱글턴을 다루는 부분을 살펴보다가 다음의 내용이 눈에 들어왔다. 권한이 있는 클라이언트는 리플렉션 API인 AccessibleObject.setAccessible을 사용해 private 생성자를 호출할 수 있다. private으로 선언한 메서드를 어떻게 호출할 수 있는 것인지 싶어 ChatGPT의 도움을 받아 통해 간단한 예시를 작성해보았다. 예시에 사용할 객체를 살펴보자. 단 하나의 인스턴스만 존재함을 보장하기 위해 전역에서 해당 객체의 인스턴스에 직접 접근할 수 있도록 public static으로 인스턴스를 정의한 뒤, 맨 처음에 생성된 뒤로는 불변 상태를 유지하도록 final 예약어를 부여했다. 그리고 해당 객체는 ..
-
소스코드에 주석은 어느 정도로 활용되어야 할까?Today I Learned 2023. 5. 26. 03:38
(해당 글은 저서 'Docs for Developers'를 참고하여 작성했으나, 다소 주관적인 견해를 담고 있습니다. 다른 견해가 있으실 경우 자유롭게 제안해주시면 감사하겠습니다.) 시간이 지나면 나조차도 내 코드를 이해하기 어렵게 된다. 프로젝트를 진행하면서 가졌었던 생각 중 하나로, 주석을 아예 작성하지 않고 단지 코드를 읽는 것만으로도 이해할 수 있는 소스코드를 작성할 수 있어야 한다는 생각이 있었다. 이를 위해 코드를 작성할 때 줄곧 다음과 같은 것들을 고려했었다. - 축약어를 사용하지 않는다. ex) a, b, i, idx, cnt, ... - 변수, 메서드 등을 네이밍할 때는 의미를 최대한 나타낸다. 이 규칙들을 지킨다고 해서 항상 읽기 좋은 코드가 만들어지지는 않았다. '의미를 최대한 나타내..
-
2023년 5월 3주차 주간회고주간 회고 2023. 5. 22. 03:41
똥을 열심히 굴렸다.이번 주 내내 지난 주에 만들어 제출했던 결과물을 (뒤에서부터는 똥이라 하겠다.) 다듬는 작업을 진행했다. 이전에 개인 프로젝트를 진행하던 당시, 검색 기능을 구현하는 과정에서 이번에 똥을 만들면서 마주한 것과 비슷한 느낌의 소스코드의 중복 문제를 일으켰던 적이 있었다. 똥이 반복해서 만들어지는 것을 그냥 방치해서는 나는 앞으로도 같은 문제에 계속 부딪힐 수밖에 없겠다는 생각이 들었고, 작정하고 문제 해결에 매달렸다. 그 결과 나름대로 정리할 수 있었던 성과가 어느정도 도출되었다. 문제를 해결한 것 같기는 한데, 정말 이상적으로 해결했다고 말할 수 있을지는 잘 모르겠어서 똥을 깔끔하게 치웠다기보다는 똥을 굴려서 예쁜 모양의 똥으로 만들었다고 표현하는 게 적절할 듯 싶다. 예쁜 모양으로..
-
[Java] testcontainers를 활용해 통합 테스트 수행하기Today I Learned 2023. 5. 20. 03:57
통합 테스트란 무엇인가? 일반적으로 코드를 작성하는 과정에서 가장 빠르게 작성할 수 있는 테스트는 단위 테스트이다. 기능을 구성하는 가장 작은 식이나 메서드 단위에서부터 빠르게 테스트를 작성하고 검증할 수 있기 때문이다. 그러나 단위 테스트만으로 전체적인 동작이 올바르게 이루어지는지 검증하기에는 부족할 수 있다. 이를테면 서버와 데이터베이스가 상호작용해 수행하는 기능에 대해 서버 범위 내에서만 동작을 검증할 경우에는, 실제로 동작이 실행되었을 때 서버 범위 바깥의 모듈과 상호작용하는 과정을 포함해서 모든 영역에서 문제 없이 완전하게 수행할 것이라고 확신하기는 쉽지 않을 것이다. 그래서 특정 기능에 관여하는 둘 이상의 모듈들을 함께 동작시켰을 때 요구되는 동작을 정상적으로 수행하는지 검증하는 방식으로도 테..
-
[Java] interface 활용하기: 함수형 인터페이스, Comparator<E> 구현체를 이용해 List 정렬하기Today I Learned 2023. 5. 16. 16:13
interface의 구현체를 정의해 특정한 로직에 활용하는 방식을 좀 더 적극적으로 활용해보자. List를 원하는 기준에 맞추어 정렬해야 하는 상황이 생겼다고 한다면, 어떻게 할 수 있을까? Java의 List interface에는 다음과 같이 정렬을 위한 default 메서드 sort()가 존재한다. 다음의 코드를 살펴보자. // List.java @SuppressWarnings({"unchecked", "rawtypes"}) default void sort(Comparator
-
2023년 5월 2주차 주간회고주간 회고 2023. 5. 14. 16:36
결국에는 모든 것들을 다 하는 게 맞다. 앞으로 해야 할 것들은 무엇일까? 과제 테스트 결과가 어떻게 나올지는 모르겠으나, 어쨌든 과제 테스트에 집중하면서 잠시 멈췄었던, 필드의 평가를 받기 위해 서류를 내미는 것을 다시 시작하는 것. 일주일에 30건을 지원해도 단 한 곳에도 붙지 않거나, 한 곳에 붙을까말까 하는 결과를 지켜보는 것은 결코 유쾌한 경험은 아니다. 애초에 찾아올 거라고 기대되지 않는 면접 기회를 생각하면서 면접 준비에 에너지를 쏟을 동기를 찾기도 쉽지 않다. 그럼에도 불구하고, 비중에 차이는 있을지언정 하나에 완전히 몰입하는 게 아니라 결국에는 이력서 지원, 면접 공부, 포트폴리오 보완을 한번에 다 해야 하는 이유는 무엇인가? 그것들이 서로 분리되어 영향을 끼치지 않는 독립적인 요소들이 ..
-
Java에서 interface와 구현체 class들을 이용해 소스코드의 중복 제거하기Today I Learned 2023. 5. 12. 03:46
... 구체적으로는 내가 구상한 방식을 따를 때 코드의 중복을 최소화할 수 있는 방안을 마련할 수 있어야 했는데 이를 고려할 시간이 부족했고, 결국 코드의 중복이 상당 부분 존재하는 상태로 코어 로직을 구현하게 되었다. (2023년 5월 1주차 주간회고 중) 이 소스코드의 중복이 도저히 눈 뜨고 넘어갈 수준이 아니었다. 마감까지 남은 시간이 굉장히 촉박한 상태에서 코어 로직을 구현한 관계로 구현 과정에서 무거운 기술 부채를 쌓게 되었다. 어떤 문제가 발생했는지 살펴보면서 이를 조금씩 개선해나가는 것을 시도해보자. 상황 살펴보기 특정 강의에 수강신청한 학생들의 수강신청 상태를 정해진 우선순위 기준들을 바탕으로 성공 상태로 변화시키거나, 실패 상태로 변화시키는 프로세스를 구현해야 하는 상황을 가정해보자. 우..