java
-
RestClient 알아보기 (RestTemplate이 Deprecated 된다고요?)Programming/Spring 2024. 6. 29. 12:05
Spring Boot 3.2에 새롭게 추가된 RestClient에 대해 알아보자.spring docs의 RestTemplate에 대한 설명에 위와 같은 NOTE가 추가되었다. Spring 6.1(Spring Boot 3.2) 버전부터는 RestClient가 더 모던한 API를 제공한다는 말이다. 그렇다면 RestTemplate은 사용하면 안 되는 것일까? RestTemplate이 Deprecated 된다?RestTemplate이 Deprecated 된다고 알고 있는 사람이 종종 있는데, 현재 RestTemplate의 JavaDoc에는 그런 말을 전혀 찾아볼 수 없었다. 이 말은 어디서 나온 것일까? 스프링 개발진의 의도를 유추해볼 수 있는 흐름을 찾아보았다.RestTemplate의 Deprecated에 ..
-
10. 이름 설계 : 구조를 파악할 수 있는 이름Study/내 코드가 그렇게 이상한가요? 2024. 2. 11. 16:55
이름을 짓는 기본적인 방법은 목적 중심 이름 설계이다. 이는 소프트웨어가 달성해야 하는 목적을 기반으로 이름을 설계하는 방법으로, 이름에서 목적과 의도를 읽고 이해할 수 있게 설계해아 한다는 것이다. 1. 부적절한 이름 온라인 쇼핑몰을 예로 들어보자. 흔히 볼 수 있는 좋지 않은 이름 설계는 상품을 그대로 '상품 클래스'라고 이름을 붙이는 것이다. 대부분의 로직이 상품을 중심으로 이루어지는 온라인 쇼핑몰 특성상 '상품 클래스'라고 단순하게 이름을 붙이는 순간, 해당 클래스는 수많은 클래스와 관련 있는 로직을 갖게 되고 점점 거대하고 복잡해진다. 1.1 관심사 분리 상품은 예약, 주문, 발송 등 다양한 관심사와 연관이 있다. 즉, 상품 클래스는 다양한 관심사와 결합되어, 온갖 것과 관련된 로직을 품게 되는..
-
9. 설계의 건전성을 해치는 여러 악마Study/내 코드가 그렇게 이상한가요? 2024. 2. 11. 05:15
이번 장에서는 지금까지 소개한 것 이외의 나쁜 코드 및 대처 방안을 공부한다. 1. 데드 코드 절대 실행되지 않는 조건 내부에 있는 코드를 데드 코드(dead code) 또는 도달 불가능한 코드(unreachable code)라고 부른다. 이러한 코드는 여러 문제를 일으킨다. 코드의 가독성을 떨어뜨린다. 코드를 읽는 사람이 데드 코드 주변을 읽을 때마다, 해당 코드가 어떤 조건에서 실행되는지 생각하게 만든다.(실제로는 실행되는 경우가 없는데도 말이다. 이는 숨겨둔 의도가 있는 것은 아닌지 생각하느라 에너지를 소비하게 한다.) 언젠가 버그가 될 가능성이 있다. 지금까지는 실행되지 않았지만, 사양 변경에 의해 도달 가능한 코드로 바뀔 수 있다. 이렇게 되살아난 코드가 변경된 사양과 다르다면 버그가 된다. 데..
-
8. 강한 결합 : 복잡하게 얽혀서 풀 수 없는 구조Study/내 코드가 그렇게 이상한가요? 2024. 1. 17. 00:44
결합도란 '모듈 사이의 의존도를 나타내는 지표'라고 할 수 있다. 어떤 클래스가 다른 클래스에 많이 의존하고 있는 구조를 강한결합(tightlycoupling)이라고 부른다. 강한 결합 코드는 이해하기 힘들고, 변경하기도 굉장히 힘들다. 이 장에서는 강한 결합을 결합도가 낮은 구조인 느슨한 결합(loose coupling)으로 개선하여 코드 변경과 이해가 쉬운 구조를 만드는 방법을 알아본다. 1. 결합도와 책무 소프트웨어가 출력, 금액 계산, 데이터베이스 등의 다양한 관심사를 가질 때, 만약 출력에 버그가 있는데 데이터베이스 로직을 수정하는 것은 말이 안 된다. 출력을 제대로 하는 것은 출력하는 로직의 책임이라고 할 수 있다. 즉 소프트웨어의 책임이란 '자신의 관심사와 관련해서, 정상적으로 동작하도록 제..
-
7. 컬렉션 : 중첩을 제거하는 구조화 테크닉Study/내 코드가 그렇게 이상한가요? 2024. 1. 16. 21:48
이 장에서는 배열과 List와 같은 컬렉션에서 발생할 수 있는 다양한 문제 사례들을 알아본다. 1. 이미 존재하는 기능을 다시 구현하지 말기 바퀴의 재발명 이미 널리 사용되고 있는 기술과 해법이 존재하는데도, 이를 전혀 모르거나 의도적으로 무시하고 비슷한 것을 새로 만들어 내는 것 대부분의 언어에서는 표준 컬렉션 라이브러리에 많은 기능이 구현되어 있다. 반복문을 사용해서 컬렉션을 직접 조작하고 있다면, 잠시 멈추고 표준 라이브러리에 같은 기능을 하는 메서드가 있는지 확인해보자. // 반복문을 사용하여 List를 직접 조작하는 예시 boolean hasPrisonKey = false; for (Item each : items) { if (each.name.equals("prisonKey")) { hasPr..
-
6. 조건 분기 : interface 활용하여 복잡한 조건 분기 제거하기Study/내 코드가 그렇게 이상한가요? 2024. 1. 6. 20:59
조건 분기는 조건에 따라 처리 내용을 전환하는 꼭 필요한 구조이지만, 조건이 복잡해지면 코드의 동작을 이해하기 힘들고 유지보수 시 여러 버그를 만들 수 있다. 이 장에서는 조건 분기를 잘 다루어 버그가 없는 설계를 만드는 방법을 설명한다. 1. 중첩되는 조건 분기 제거하기 코드를 보다보면 if 조건문이 여러 개 중첩되어 사용된 경우가 있다. 조건 분기의 중첩은 코드의 가독성을 크게 떨어뜨린다. if (조건) { // ... if (조건) { // ... if (조건) { // ... if (조건) { // ... } else { // ... } } } } 중첩 구조 사이사이에 수많은 코드가 섞여 있으면, 각 조건문의 범위를 찾기도 매우 힘들고, 각 조건에 따라 어떤 로직이 처리되는 지 알기 힘들다. 이런..
-
5. 응집도 : 흩어져 잇는 것들Study/내 코드가 그렇게 이상한가요? 2023. 12. 20. 21:48
응집도(cohension)란 '모듈 내부에 있는 데이터와 로직 사이의 관계가 얼마나 강한지 나타내는 지표'이다. 여기서 모듈은 클래스, 패키지, 레이어 등을 모두 포함할 수 있다. 응집도가 높은 구조는 변경하기 쉬우며 바람직한 구조인 반면, 응집도가 낮은 구조는 변경 시 문제가 발생하기 쉽다. 이러한 응집도를 낮추는 사례들을 알아보자. 5.1 static 메서드 오용 static 메서드를 오용하면 응집도가 낮아질 수 있다. 아래 예시를 살펴보자. // 주문을 관리하는 클래스 class OrderManager { static int add(int moneyAmount1, int moneyAmount2) { return moneyAmount1 + moneyAmount2; } } // static메서드를 사용..
-
4. 불변 활용하기 (안정적으로 동작하게 만들기)Study/내 코드가 그렇게 이상한가요? 2023. 12. 20. 11:07
가변과 불변을 적절하게 설계하지 못하면 동작을 예측하기 어렵고 혼란스러워진다. 이러한 상황을 피하기 위해 가능한 한 상태가 변경되지 않도록 불변을 활용하여 설계하는 방법을 알아본다.4.1 재할당재할당(파괴적 할당) : 변수에 값을 다시 할당하는 것 재할당은 변수의 의미를 바꿔 추측하기 어렵게 만들고, 언제 어떻게 변경되었는지 추적하기도 힘들게 만든다.int damage() { // 기본 공격력 int tmp = member.power() + member.weaponAttack(); // 속도로 공격력 보정 tmp = (int)(tmp (1f + member.speed() / 100f)); // 적 방어력 적용 tmp = tmp - (int)(enemy.defence / 2); // 음수 조정 tmp = ..