본문 바로가기

분류 전체보기134

1-6. AOP (2) 이전에 JDK 다이내믹 프락시를 사용해 반복되는 로직을 제거하며, 핵심 기능과 부가 기능을 분리해 보았습니다. 변하지 않는 타깃으로의 위임과 부가기능 적용 여부 판단이라는 부분은 코드 생성기법을 이용하는 다이내믹 프락시 기술에게 맡기고, 변하는 부가기능 코드는 별도로 만들어서 다이나믹 프록시 생성 팩토리에게 DI로 제공하는 방법을 사용했습니다. 그렇다면 반복적인 프락시 메서드 구현을 코드 자동생성 기법을 이용해 해결했다면 반복적인 ProxyFactoryBean 설정 문제는 설정 자동등록 기법으로 해결 할 수 업슬까? 또는 실제 빈 오브젝트가 되는 것은 ProxyFactoryBean을 통해 생성되는 프록시 그 자체이므로 프락시가 자동으로 빈으로 생성되게 할 수는 없을까? 스프링에서는 빈 후처리 기를 이용해.. 2023. 1. 10.
1-6. AOP (1) AOP는 IoC/DI, 서비스 추상화와 더불어 스프링의 3개 기반기술의 하나입니다. AOP는 스프링의 기술 중에서 가장 이해하기 힘든 난해한 용어와 개념을 가진 기술로 악명이 높습니다. ... 필연적인 등장배경과 스프링이 그것을 도입한 이유, 그 적용을 통해 얻을 수 있는 장점이 무엇인지에 대한 충분한 이해가 필요합니다. 그래야지만 AOP의 가치를 이해하고 효과적으로 사용할 방법을 찾을 수 있습니다. (p.401) 이번 6장은 분량이 많아 1, 2로 나누어 포스팅하겠습니다. 6장은 기존의 어떤 문제로 인해 AOP가 등장하게 되었는지, 어떤 방식으로 AOP가 동작하는지 그리고 AOP에 관련된 용어들에 대해 학습합니다. 읽기 모임에서 토비 님께서 직접 AOP가 가장 재미있고 중요하다고 생각한다고 말씀하셨는데.. 2023. 1. 9.
아파치 카프카 애플리케이션 프로그래밍 with 자바 아파치 카프카 애플리케이션 프로그래밍 with 자바 아파치 카프카 애플리케이션 개발을 위한 「실전 가이드」 아파치 카프카란 무엇일까? 카프카 애플리케이션은 어떻게 만들까? 데이터 파이프라인을 만들기 위해 어떤 카프카 라이브러리를 사용해야 할까? 클라우드 기반 아파치 카프카는 어떤 기능을 가지고 있을까? 이 책은 아파치 카프카의 기본적인 개념과 상용 프로젝트에 카프카를 사용하는 방안, 그리고 코드를 기반으로 연동 애플리케이션을 개발하는 과정을 소개한다. 또한, 「실전 프로젝트」에서 실무에 많이 사용되는 아키텍처와 유사한 구조로 실습을 진행하며 상용 환경에서 어떻게 데이터 파이프라인을 구축하는지 설명한다. 이 책을 통해 카프카와 연관된 플랫폼들과의 관계를 전체적으로 이해하는 것을 넘어 카프카를 업무에 성공적.. 2023. 1. 9.
6~12. 리팩터링 이 포스팅은 리팩터링 2판으로 학습한 내용을 토대로 정리한 포스팅입니다. 6~12장은 1장에서 사용했던 리팩토링 패턴들을 하나씩 별도의 예제와 함께 학습하는 것이기 때문에 예제 코드를 첨부하지는 않고 어떠한 방법들이 있는지에 대해 정리해 보겠습니다. 6. 기본적인 리팩터링 리팩터링 이름 반대 함수 추출하기 함수 인라인하기 함수 인라인하기 함수 추출하기 변수 추출하기 변수 인라인하기 함수 선언 바꾸기 변수 캡슐화하기 변수 이름 바꾸기 매개변수 객체 만들기 여러 함수를 클래스로 묶기 여러 함수를 변환 함수로 묶기 단계 쪼개기 7. 캡슐화 리팩터링 이름 반대 레코드 캡슐화하기 컬렉션 캡슐화하기 기본형을 객체로 바꾸기 임시 변수를 질의 함수로 바꾸기 클래스 추출하기 클래스 인라인하기 클래스 인라인하기 클래스 추.. 2023. 1. 8.
4. 테스트 구축하기 이 포스팅은 리팩터링 2판으로 학습한 내용을 토대로 정리한 포스팅입니다. 리팩터링은 분명 가치 있는 도구지만, 그것만으로는 부족합니다. 리팩터링을 제대로 하려면 불가피하게 저지르는 실수를 잡아주는 견고한 테스트 스위트가 뒷받침돼야 합니다. 리팩터링을 하지 않더라도 좋은 테스트를 작성하는 일은 개발 효율을 높여줍니다. (p.133) 4.1 자가 테스트 코드의 위치 프로그래머들이 어떻게 일하는지 가만히 살펴보면 실제로 코드를 작성하는 시간의 비중은 그리 크지 않음을 발견할 수 있습니다. 대부분의 시간은 디버깅에 씁니다. 버그 수정 자체는 대체로 금방 끝납니다. 진짜 끔찍한 건 버그를 찾는 여정입니다. 모든 테스트를 완전히 자동화하고 그 결과까지 스스로 검사하게 만들자. 테스트 스위트는 강력한 버그 검출 도구.. 2023. 1. 8.
3. 코드에서 나는 악취 이 포스팅은 리팩터링 2판으로 학습한 내용을 토대로 정리한 포스팅입니다. 리팩터링을 언제 시작하고 언제 그만할지를 판단하는 일은 리팩터링의 작동 원리를 아는 것 못지않게 중요합니다. 하지만 이런 일들을 '언제' 해야 하는지에 대해서는 명확하게 정립된 규칙이 없습니다. 마틴 파울러 님도 명확하게 규칙을 제시하지는 않고 아래와 같은 말로 대신했습니다. 냄새나면냄새나면 당장 갈아라. - 켄트 벡 할머니의 육아 원칙 냄새는 일종의 코드가 풍기는 악취라고 볼 수 있으며, 냄새가 나는 코드로써 24가지 예시를 듭니다. 3.1 기이한 이름 (Mysterious Name) 코드는 단순하고 명료하게 작성해야 하며, 코드를 명료하게 표현하는 데 가장 중요한 요소는 바로 '이름'입니다. 그래서 그 이름만 보고도 각각이 무슨.. 2023. 1. 8.
2. 리팩터링 원칙 이 포스팅은 리팩터링 2판으로 학습한 내용을 토대로 정리한 포스팅입니다. 리팩터링이라는 용어는 명사로도 쓸 수 있고, 동사로도 쓸 수 있고 그에 따라 의미가 달라집니다. 리팩터링: [명사] 소프트웨어의 겉보기 동작은 그대로 유지한 채, 코드를 이해하고 수정하기 쉽도록 내부 구조를 변경하는 기법 리팩터링: [동사] 소프트웨어의 겉보기 동작은 그대로 유지한 채, 여러 가지 리팩터링 기법을 적용해서 소프트웨어를 재구성하다. 위의 의미를 통해 리팩터링이란 특정한 방식에 따라 코드를 정리하는 것만이 리팩터링이라고 할 수 있습니다. 누군가 "리팩터링하다가 코드가 깨져서 며칠이나 고생했다"라고 한다면, 십중팔구 리팩터링한 것이 아니다. (p.80) 리팩터링은 전과 후의 코드가 똑같이 동작해야 하며, 리팩터링의 목적은.. 2023. 1. 8.
1. 리팩터링: 첫 번째 예시 이 포스팅은 리팩터링 2판으로 학습한 내용을 토대로 정리한 포스팅입니다. 리팩터링이란 무엇일까? 그렇다면 리팩토링을 왜 해야 할까? 앞서 리팩토링의 설명에서 가독성과 유지보수를 편하게 라는 단어가 나오는데 이 2개의 단어가 왜 중요할까? 우리는 대부분 혼자서 개발을 하지 않고 다른 사람들과 협업을 통해 개발을 하게 됩니다. 이때 협업을 보다 편하게 하려면 내가 작성한 코드가 다른 사람들에게 보다 쉽게 읽혀야 하고(가독성) 기능을 추가함에 있어서 기존에 작성해둔 코드를 크게 변경하지 않고 기능을 추가할 수 있어야 한다(유지보수를 편하게) 그러면 리팩토링을 함으로써 얻게 되는 이점, 또는 결과는 무엇일까? 개인적으로는 비용이라고 생각합니다. 가독성이 높아지고, 유지보수가 편해진다는 것은 시간이 절약된다는 뜻.. 2023. 1. 8.
1-5장. 서비스 추상화 5장은 서비스 추상화로 기존의 초난감 DAO에서 기능을 추가하고 리팩토링 과정을 거쳐 더 나은 구조를 설계하는 과정을 소개합니다. 5장에서는 초난감 DAO에서 사용자의 레벨 관리 기능을 가지고 기능 추가 및 리팩토링 과정을 학습합니다. public class User { private String id; private String name; private String password; private static final int BASIC = 1; private static final int SILVER = 2; private static final int GOLD = 3; private int level; /* 사용자 레벨 관리 기능 추가로 level 필드를 추가했다. level 필드는 단순히 int .. 2023. 1. 8.
1-4장. 예외 자바 개발자가 가장 신경 쓰기 귀찮아하는 것 중의 하나가 바로 예외처리입니다. 정상적인 결과와 흐름을 보여주는 코드를 만들기도 버거운데 예외상황까지 처리해야 한다는 사실이 부담스러울 수도 있습니다. 그래서 예외와 관련된 코드는 자주 엉망이 되거나 무성의하게 만들어지기 쉽습니다. 때론 잘못된 예외처리 코드 때문에 찾기 힘든 버그를 낳을 수도 있고, 생각지 않았던 예외상황이 발생했을 때 상상 이상으로 난처해질 수도 있습니다. (p.279) 토비님은 코드를 확인할 때 예외 처리가 제대로 되어 있지 않으면 점수를 깎는다고 합니다. 추가로 학습 테스트나 예제를 작성하는 경우에도 예외 처리를 대충 해서는 안된다고 강조합니다. 예외 처리를 할 때 하지 말아야 할 방법으로는 크게 3가지가 있습니다. 예외를 잡고 아무것.. 2023. 1. 8.
1-3장. 템플릿 템플릿이란 이렇게 바뀌는 성질이 다른 코드 중에서 변경이 거의 일어나지 않으며 일정한 패턴으로 유지되는 특성을 가진 부분을 자유롭게 변경하는 성질을 가진 부분으로부터 독립시켜서 효과적으로 활용할 수 있도록 하는 방법이다. (p209) 3장에서는 초난감 DAO에 "예외 처리"를 추가하면서 템플릿의 필요성에 대해 설명합니다. 초난감 DAO에 예외 처리를 하기 위해서 try-catch-finally 구문을 사용합니다. Connection c = null; PreparedStatement ps = null; ResultSet rs = null; User user = null; try { c = connectionMaker.makeConnection(); ps = c.prepareStatement( "select.. 2023. 1. 7.
1-2장. 테스트 애플리케이션은 계속 변하고 복잡해져 갑니다. 그 변화에 대응하는 첫 번째 전략이 확장과 변화를 고려한 객체지향적 설계와 그것을 효과적으로 담아낼 수 있는 IoC/DI 같은 기술이라면, 두 번째 전략은 만들어진 코드를 확신할 수 있게 해 주고, 변화에 유연하게 대처할 수 있는 자신감을 주는 테스트 기술입니다. (p145) 2장에서 테스트를 설명하면서 토비님은 "스프링으로 개발을 하면서 테스트를 만들지 않는다면 이는 스프링이 지닌 가치의 절반을 포기하는 셈"이라고 하실 정도로 테스트의 중요성을 강조하고 있습니다. 2장은 전반적으로 테스트의 중요성, 그리고 테스트를 작성해야 하는 이유에 대해 친절히 설명하고 있습니다. public static void main(String[] args) throws SQLEx.. 2022. 9. 19.
1-1장. 오브젝트와 의존관계 저는 개인적으로 1장에서 가장 흥미로웠던 부분은 1.1 ~ 1.4까지 이어지는 초난감 DAO의 리팩터링 과정이라고 생각합니다. 예전에 읽었을 때는 못 느꼈지만 이번에 읽어보니 토비 님께서 DI(Dependency Injection)를 설명하기 전에 DI가 왜 필요한지 직접 코드로 보여주셔서 DI라는 개념을 더 쉽게 이해할 수 있었습니다. 관심사의 분리 : 중복 코드 메서드 추출 DB Connection 코드 독립 : 상속을 통한 확장 (is-a) DAO의 확장 : 포함 관계를 통한 확장 (has-a) 인터페이스 도입 관계 설정 책임의 분리 - 인터페이스 구현체 주입을 외부로 분리 관심사의 분리 관심이 같은 것 끼리는 모으고, 관심이 다른 것은 따로 떨어져 있게 하는 것입니다. 상속을 통한 확장 (is-a.. 2022. 9. 5.
토비의 스프링 3.1 시작하기 참여 계기 & 다짐 디스코드에서 토비의 스프링 3.1 저자이신 이일민(이하 토비)님께서 주관하시는 '토비의 스프링 3.1 읽기 모임'이 생긴 걸 알게 되었는데, 좋은 경험과 유익한 시간이 될 것 같아 읽기 모임에 참여하게 되었습니다. 이전에도 읽어본 적이 있기는 하지만 이번에 읽었을 때는 또 어떤 느낌을 받을지, 어떤 것들을 느낄지 기대가 되며 다시 토비의 스프링 3.1을 펼쳤습니다. 하지만 이번에는 다른 분들과 생각을 공유하는 것이기 때문에 이전과의 차이도 둘 겸, 각 챕터별로 읽은 후 블로그에 제 생각과 느낀 점들을 정리하려고 합니다. 또 이번에는 책에 나와 있는 예제들을 실제 코드로 작성해 봅니다. github 주소: https://github.com/kiekk/tobyspringin5 들어가며 토.. 2022. 9. 4.