서재/밥벌이

Spring Boot Up&Running (처음부터 제대로 배우는 스프링 부트) - 강의 전에 다시 볼 것

눈써비 2024. 10. 6. 22:49

최근 한국 저자의 책을 읽어서 그런지 상대적으로 더 좋은 느낌.

물론 이력 자체가 우리나라에서 나오기 힘든 이력의 소유자.

방금 이 글을 쓰다가 나모덕에 저자가 한국왔었던 영상 입수 : 책의 내용과 직접적인 관련은 없고, 기록용. 그리고 Reactive니까 관련이 아예 없진 않다.

https://www.youtube.com/watch?v=9hWDSY4MKCc

 

일단 내가 아쉬운 부분을 찾을 수 없고, 읽기 급급했다.

어제부터 2일간 읽어냈고, 코딩은 하지 않았다. (상상코딩? ㅋㅋ)

 

사실 강의 때문에 

그리고 그동안 미루어왔던 스프링 공부,

꽤 손을 놓은 듯한 실무 공부,

여러가지 의미가 있었고, 살짝 아드레날린도 지린 듯 하다.

 

그동안 넋놓고 있었는데,

이미 세상은 내 허락 없이 Reactive로 흘러가고 있었다.

 

Reactive VS Servlet

 

non-blocking.

별도의 쓰레드를 생성하지 않고, 자체적으로 유휴 자원을 사용하는 기법. 이라고 해야하나.

어쨋든 이 부분도 이제 그만 넋놓고 시작해야겠다.

쿠버네티스도 적용해야서 골치 아픈데, 이것도 해야하는군.

 

일단 잡소리 치우고 책 정리를 좀 해둘까 한다.

몇 가지 포인트를 적어두고, 필요할 때 책을 다시 빌리던가 하나 구매해야겠다.

 

기초 책인데 뒷 부분은 나도 모르는, 시대에 뒤떨어진 개발자 나부랭이같으니.

VMware의 개발자라서 멋진데,

Spring Developer Advocate, 

Java Champions (자바 챔피언이라니 한쿡인이 작명했나 - 그리고 난 왜 자바챔피언이라는게 있는지 이제 알았을꼬.)

 

또 샜다. 다시 정리.

 

1장에서 스프링 부트에 대한 칭찬. 마법이라고.

convention over configuration (설정보다 관습)을 논한다.

그리고 '개발자 우선 환경'이 localhost가 기본값임을 칭찬.

여튼 1장은 개요.

 

2장

spring boot 

아! 그전에 SDKMAN !! 자바 관리 툴 - 조만간 맥의 java 리셋해야지.

음 나도 나름 여러 버전의 java를 설치한 후 환경설정에서 주석을 통해 사용 중이었는데, 요새 진짜 java에 무관심했다.

스프링 이니셜라이저는 패스하자.

 

3장부터는 프로젝트를 하나하나 쌓아간다.

첫 번째 REST API

패스 하기 그러니 나도 안 읽은 REST API 논문이나 적어두자.

httpie에 대한 소개가 나온다.

기본 요청값은 GET(이건 어디나 다 마찬가지), 호스트 이름이 없다면 localhost 

그런데 문제는 말입니다. httpie를 설치해야 한다는 것. curl은 기본이잖어!

그나저나 homebrew로 설치하는 것은 최소화 하는 편인데, 이것과 MacPorts 밖에 설치 방법이 없다 (현재 2024.10.10) 

덕분에 MacPorts 라는 것도 알게되긴 했다.

 

여튼 httpie는 사용법이 간단하긴 하다.

4장 데이터베이스 액세스.

h2를 통해 spring data 사용.

이쯤 봤을 때도 군더더기 없고, 소스 구현도 멋지고, 사실 저자의 이력따위는 어느정도 보긴 하지만 책의 실력 자체 감동이 중요하다.

패스.

 

5장 애플리케이션 설정과 검사

@Value 대신 @ConfigurationProperties를 사용하자라고.

난 @Value 변태인데 앞으로 바꾸고 리팩토링도 해야할 포인트.

그리고 actuator 소개. 우린.. health check 용으로 사용하는데..

로깅용으로 잘 사용해봐야겠다.

 

6장 데이터 파고들기.

여기서 부터 본격적으로 실력이 나오고 책의 구성에 감동하기 시작.

0. spring data 소개 : ' 스프링데이터의 미션 : 기본적인 데이터 저장의 특수한 속성을 유지하면서 데이터에 액세스하는 친숙하고 일관된 스프링 기반 프로그래밍 모델을 제공하는 것' - 스프링은 늘 보면 말만 뻔지르하지 않고 실속이 있어서 좋다. 보통 많은 것들이 다 프로 이빨러인데.

entity 탓인지 DDD(Domain-Driven Desing도 등판) : 그러고 보니 도메인 주도 설계를 2/3 쯤 읽고 갖다 주느라 아직 완독 전인데 다시 빌려봐야겠다.

롬복도 등판.

 

1. 레디스+ 템플릿 기반으로 어렵게 구현

2. 템플릿을 repository로 변환

3.JPA로 repository 사용

4. mysql로 변경

5. 몽고DB로 변경 - 여기서 코틀린과 gradle 사용하여 다양성 극대화.

6. 다시 java로 돌아왔지만 NoSQL 그래프 데이터베이스 사용 (Neo4j - 여러 DB 있지만 걍 닥치고 이거써라 : 우린 또 능력자가 쓰라고 하면 1도 고민안하고 바로 잘 써주지)

이미 jpa의 위력을 잘 알고 있지만, 3에서 6까지 가는 길에 얼마나 수정이 적은지도 잘 보인다. 물론 대규모로 가면 이렇게 단순하지는 않지만. 그래도 jpa의 위력이 있지.

 

7장 스프링 MVC로 만드는 애플리케이션

억지로 스프링 MVC 설명. 이정도는 패스하고,

1. template engine 통한 구현

슬슬 view template engine도 소환되서 frontend도 시작.

예상했듯이 닥치고 Thymeleaf 권유.

2. message queue 사용한 구현

RabbitMQ와 아파치 카프카.

그리고 메시지 파이프라인 활용을 위한 spring cloud stream.

설정만으로 MQ 사용이 간단함을 정리해줌.

MQ를 사용하여 Supplier 소스와 Consumer 소스 구현.

3. web socket 구현

성능좋고, 폴링 서비스가 아닌 웹소켓 구현!

 

8장 프로젝트 리액터와 스프링 웹플럭스를 사용한 리액티브 프로그래밍

여기서부터 미지의 영역.

우리가 일단 리액티브 프로그래밍을 안하고 있다.

가야할 길이긴 하다.

일단 위에도 적었듯 논블러킹의 이해를 해야하고,

톰캣과 네티의 비교가 하나 있다.

논블럭킹에 강한 네티를 써야한다.

그리고 JPA 대신 R2DBC(Reactive Relational Database Connectivity) 사용하면 된다.

그리고 용어 정리 하나.

선언형 프로그래밍을 가자. (이거 쿠버네티스랑 똑같다.)

그리고 frontend도 바꿔야한다는데, 일단 이렇게까지 갔을 경우 thymeleaf를 쓰지 않을테니 넣어두자.

그다음은 RSocket

RSocket

1)요청-응답

2)요청-스트림

3)실행 후 무시 (Fire & Forget)

4)요청 채널 (양방향 스트림)

아직 감은 잘 안오지만, 연결 후에는 서버-클라이언트 구분이 없다고,

여튼 기술이야 더 심도있게 공부하면 되고, 대충 이정도의 기술스택이 필요하고,

소스 수정량이 많지는 않다.

그리고 모두 안바꾸고 필요한 부분부터 리팩토링해 나가면 된다.

 

9장 프로덕션을 위한 애플리케이션 테스트

테스트 철학 :'흥미로운 동작'에만 의도적으로 테스트를 작성하는 '충분한 테스트' 방식.

@SpringBootTest 설명

여기까지 왔던 소스를 테스트 기능을 넣으며 리팩토링 시전.

ApplicationContext 자동 설정.

webEnviroment 매개변수 네개. - MOCK , RANDOM_PORT, DEFINED_PORT, NONE

 

10장. 애플리케이션 보안

인증 및 인가 설명 패스

1. 스프링 시큐리티 폼 기반 인증 및 인가 구현

2. 인증 및 인가를 위한 OIDC와 OAuth2 구현

- 스프링 시큐리티 라이브러리 제거하고 Okta 활용하여 인증/인가 구현

대충 감으로 알겠는데 구현을 안하고 눈으로 읽으니 조금 헷갈림. 일단 덜 중요하니 이정도만 기록.

 

11장 애플리케이션 배포

1. '완전히' 실행 가능한 JAR에서 뭘 제거하면 크기도 줄고 실행 속도도 빠르다고 한다. 음..그정도로 속도가 중요..하긴 하지만..

따라가기 어려움.

2. 컨테이너에 스프링 부트 애플리케이션 배포하기

어차피 쿠버네티스 때문에 가야할 길.

3. 스프링 부트 애플리케이션 검사를 위한 유틸리티 컨테이너 이미지 - pack과 dive

이것도 언젠가 필요하면 찾아보지 뭐.

 

12장 리액티브로 더 깊이 들어가기

용어로 정리해보면

현재 우리가 개발 중인 것은 imperative(명령형) java, 

리액티브 프로그래밍은 declative(선언형) java

1. 그래서 리액티브는 언제 사용해?

언젠가 하겠지. 다만 모든 것을 사용하지는 않을 거고,

러닝커브도 크니까 서서히 공부해나가야해.

2. 리액티브 애플리케이션 테스트

또 관심사의 분리 후 리팩토링 후 테스트 구현

3. 리액티브 애플리케이션 진단 및 디버깅

아무래도 비동기니까 추적이 어려울거고, 뭐 이런저런 것 하다보면 이렇게 해 라고 알려줌. 나중에 이것도 필요하면 다시 보면되고,

 

그리고 12장에서 감동 포인트 하나.

며칠 전 읽었던 스프링 부트3 자바 백엔드 개발 입문(후..똑같이 입문 책이구나)에서 아쉬웠던 service 부분에 대한 완벽한 설명.

 

컨트롤러 기능을 벗어나는 또 다른 비즈니스 로직 코드가 있는데, 바로 AircraftRepository빈을 사용해 항공기 위치를 획득, 저장, 조회하는 것입니다. 일반적으로 특정 클래스와 관련이 되지 않은 복잡한 비즈니스 로직이 해당 클래스에 있으면, 앞서 RSocketRequester빈을 분리했던 것처럼 해당 코드는 분리하는 것이 좋습니다. 다소 복잡하고 관련 없는 이 코드를 PositionController 외부에 재배치하기 위해 PositionSerivce 클래스를 생성하고 애플리케이션 전체에서 사용 가능한 @Service 빈으로 정의합니다. @Service 어노테이션은 단순히 자주 사용되는 @Component 어노테이션을 시각적으로 보여주는 설명입니다. 

 

후.. 길다.

보통 내가 책을 읽고 책을 다시 살펴보면서 하나하나 정리하지는 않는데, 큰 행사 치렀다.

내가 개발할 때는 어느정도 직감으로만 알고, 그릇된 길로 가지만 않으면 되는데,

남을 멘토링 하려면 용어들도 정확하게 알고 있어야한다.

힘든 일이다.

 

그래도 정말 좋은 책이다.

 

소스

원서의 소스 : https://github.com/mkheck/SpringBootUpAndRunning

 

GitHub - mkheck/SpringBootUpAndRunning: Code to accompany my book Spring Boot: Up and Running, available at bitly.com/springboot

Code to accompany my book Spring Boot: Up and Running, available at bitly.com/springbootbook - mkheck/SpringBootUpAndRunning

github.com

역서의 소스 : https://github.com/springboot-up-and-running/SpringBootUpAndRunning-Spring-Boot-3

 

GitHub - springboot-up-and-running/SpringBootUpAndRunning-Spring-Boot-3

Contribute to springboot-up-and-running/SpringBootUpAndRunning-Spring-Boot-3 development by creating an account on GitHub.

github.com

 

추가정리

반응형