'자바 웹 프로그래밍 Next Step'을 읽고 쾌감으로 쓰는 후기

아양시·2023년 3월 18일
3
post-thumbnail

  2023년 2월 15일부터 3월 15일까지 친애하는 학우들과 독서 스터디를 진행하며 박재성 님의 책 자바 웹 프로그래밍 Next Step을 읽었다. 매주 두 장씩 읽고 각자 한 장씩 맡아 정리를 해와서 내용을 함께 나누는 방식으로 스터디를 진행했다.

스터디 정리 모음   |   내 정리


책을 읽기 전의 나는 ..

  작년 여름쯤부터 스프링을 대충 배워 프로젝트를 몇 개 완성해 보면서 '나도 이제 REST API 짤 수 있다!'라는 성취를 이룰 수 있었다. 하지만 그것은 객체 간의 의존 관계가 복잡하지 않은, 간단한 CRUD 수준에서의 이야기였다. 조금만 객체 간 의존 관계가 다양해지면 빈에 중복으로 등록되거나 순환 참조가 발생하는 등 .. 어려움을 겪었다. 스프링에서 제공해 주는 라이브러리를 사용할 줄만 알았지, 프로그램 실행 시, 서버로 요청이 들어온 경우에 어떤 일들이 어떤 순서로 발생하는지, 이 어노테이션은 어떤 과정으로 어떤 기능을 하는지 전혀 알지 못했던 것이다. 이것에 대한 갈증을 계속해서 느끼고 있었고, 이 지식의 부재로 지속적으로 벽에 부딪혔다.

  이 책은 적어도 내가 아는 만큼에서의 내 지식의 부재를 상당 부분 해결해 주었다. 코드로 보여줘서 구조를 이해하기도 좋았고, 저자님께서 처음 배우는 사람들의 고충을 십분 이해하는 듯 격려도 해주시고, 중간중간 공부법이나 책을 추천해 주시기도 해서 너무 어렵지 않게 읽을 수 있었다. 나처럼 대충 간단한 API를 작성할 수는 있지만, 동작 과정이나 내부 구조에 대한 지식 결여로 인해 한계를 마주한 사람들이 이 책을 읽는다면, 확실히 한 단계 성장할 수 있을 것이다. 책에서 배운 모든 내용 정리는 위 링크에서 확인할 수 있고, 대표적으로 유레카! 였던 배움들을 아래에 간단히 적어보려 한다.


그래서 서블릿이 뭔데?

  '서블릿'이라는 단어를 주변에서 많이도 들어왔는데, 그때마다 나는 '그래서 서블릿이 뭔데?' 했다. 그것은 너무도 추상적이고 논리적인 개념이라 정확히 뭘 의미하는지 이해하기 힘들었던 것 같다.

서블릿은 자바에서 HTTP 요청과 응답에 대한 표준을 제공하는 웹 프로그래밍 기술이다.

라고 정의해 본다. 한 줄로 정리할 수 있는 게 어찌나 큰 쾌감인지 _

  톰캣 같은 서블릿 컨테이너에 의해 서블릿 클래스가 생성되고 관리된다. 이 책에서는 서블릿 컨테이너를 직접 구현해 본다. 클래스 하나에서 소켓을 열어 요청을 받아 처리하는 것에서 시작해, 클래스를 분리하고 리팩토링하며 자연스럽게 서블릿의 개념과 연결 지어 설명한다. 실제로 자바의 servlet 패키지를 열어보면 책에서 구현했던 코드와 비슷한 클래스들을 볼 수 있어 더 잘 와닿았던 것 같다.


객체지향과 리팩토링

  이 책이 자바 웹 프로그래밍 관련 책인지, 리팩토링 책인지 헷갈릴 만큼 리팩토링의 비중이 상당한데, 그 모든 것이 객체지향의 의미를 깨닫게 해주었다. 지금까지 나는 객체지향이 뭔지 모르고 있었구나를 깨달았다. 그저 클래스를 짜고 그것을 인스턴스화해서 사용한다고 객체지향이 아니다.

객체지향 설계의 핵심은 역할, 책임, 협력이다.

  이것이 다인 것 같다. 이 외의 다형성, 인터페이스, 상속 등등은 모두 이것을 실현하기 위한 도구인 것 같다. 각 클래스들에 확실한 역할을 부여하고, 해당 객체는 그 역할만을 책임지도록 한 뒤 각 객체들 간의 협력으로 프로그램을 구성해야 하는 것이다. 이 책에서는 이를 실현하기 위해 기존 코드에서 문제를 발견하고 다양한 리팩토링 기법으로 그것을 풀어나가는 과정을 반복한다. 이 책을 읽으며 함께 진행하고 있는 프로젝트에서 책에서 배운 대로 리팩토링해보려 노력하고 있다. 직접 해보려고 하니 사람이 절차식으로 사고하다 보니 객체지향으로 설계하기 쉽지 않고, 이 역할이 이 클래스 몫인지 저 클래스 몫인지, 이 역할을 할 클래스나 메소드 이름은 뭐가 좋은지 판단하기가 쉽지 않다. 그렇지만 맞는 방향을 깨달은 것 같고, 이대로 연습하면 더 잘해질 것이다.

  이제서야 객체지향 5대 원칙을 조금이나마 이해한 것 같다. 그저 면접용 주입식 암기로 알고 있었고 용어도 100%는 이해하지 못했었지만, 위의 내용을 모두 포함하는 근본 원칙이었다. 객체지향, 자바 개발자로서 중요성을 느꼈고, 객체지향에 대해서는 여전히 모르는 부분이 많아 계속 공부해가야 할 부분인 것 같다.


Bean과 DI

  이 부분이 가장 부족함을 체감하고 갈증이 컸던 부분이다. 도대체 빈은 어떻게 구성되고 의존성은 어떻게 주입되기에 나는 빈 중복 등록과 순환 참조를 마주하는 걸까. 또 나는 도대체 어떤 것을 빈으로 등록해야 하는 걸까.

  책에 나온 MVC와 DI 프레임워크에서의 대략적인 빈 등록과 DI 과정은 다음과 같다.

1. 서블릿 컨테이너가 구동되고 서블릿이 초기화된다.
2. @Configuration 이 붙은 설정 클래스 내 @Bean 메소드로 만들 수 있는 객체를 빈 후보로 등록한다.
3. @Component 등이 붙은 클래스들을 스캔하고 각 클래스의 의존성 주입 정보를 저장한다.
4. 각 빈 등록 후보들의 객체를 각자의 방법으로 생성하고, 의존관계를 주입한다.
5. 생성한 객체를 빈에 등록 후 해당 클래스에 @PostConstruct 메소드가 있으면 실행한다.

  이걸 알고 나서 로깅 필터를 추가하다가 또 빈 중복 등록을 마주했는데, chatGPT의 코드를 참고하다 필터 객체에 대해 2, 3번 과정에 모두 포함되도록 한 것을 바로 알아챘고, 신속하게 필터 클래스에서 @Component 어노테이션을 삭제해서 해결했다. 정말 별것은 아니지만 이때의 쾌감 ! 잊을 수 없다.

  그리고 의존성 주입에 대해 꽤 어렵게 생각했었는데, 그냥 말 그대로 객체를 클래스 내에서 선언하는 것이 아니라 외부에서 전달해 주는 것이었다. 생성자 또는 함수 파라미터를 통해서 전달할 수 있다. 또한, 필드 주입, Setter 주입, 생성자 주입이 각각 Reflection을 통해 어떻게 이루어지는지 배울 수 있어서 암기식으로 배운 지식들을 더욱 폭넓게 이해햘 수 있었다.


스터디로 공부하는 것에 대해

  마지막으로 스터디로 공부하며 느낀 것에 대해 이야기해 보려고 한다. 우선, 나는 확실히 입 밖으로 지식을 꺼냈을 때 더 잘 습득하는 것 같다. 말을 하고 들으면서 확실하게 이해하고 정리가 된다. 그리고 다양한 수준의 지식을 가지고 있는 사람들이 모여서 같은 주제에 대해 나누는 모든 대화가 배움으로 이어짐을 느꼈다. 여럿이 함께 하기 때문에 진도가 미뤄지지 않고 완주하기도 훨씬 수월하다. 혼자서는 이해하기 어려운 내용을 공부하거나 지속하기 힘들 때 스터디는 매우 좋은 방법인 것 같다. 하지만, 혼자 이해한 것, 알고 있는 내용을 잘 설명하는 것이 쉽지는 않다. 확실히 잘 할 필요가 있고 연습을 해야 할 것 같다.

  이제 또 새로운 책을 시작한다. 이 책을 통해 느낀 배움의 쾌감을 잊지 않고 계속해서 열심히 공부해 나가보자 !

profile
BE Developer

0개의 댓글