[우아한테크코스] 2월 20일 TIL
2 minute read
오늘 배운 것
- 강의 - 우아한 스프링 부트
- 미션 - 로또 미션 피드백 정리
- 독서 - 객체 지향의 사실과 이해
우아한 스프링 부트
- 스프링 부트가 다루는 영역
- 빌드: 프로젝트 생성, 의존성 관리, 애플리케이션 패키징 및 실행
- 코딩: 개발 툴 제공, 자동 설정, 외부 설정
- 배포 및 관리: 도커 이미지 생성, actuator, 스프링 부트 어드민
- 빌드
1. 프로젝트 생성
- 빌드툴(gradle, maven) 선택
- 언어(java, kotlin, groovy) 선택
- 버전(스냅샷: 개발 중, m2: 배포했지만 변경 가능 있는 것, 아무것도 없는 것: 권장) 선택
- 프로젝트 메타데이터: group, artifact, version, package(Java ARcive, Web Application aRchive)
- 의존성 선택
- 의존성 관리
- springboot-starter-thymeleaf의 버전이 dependency가 되어있으므로 그 자식들이 버전으로 들어오는 것이다.
- 스프링부트가 내가 사용하고자 하는 의존성에 적합한 버전을 알아서 찾아준다.
- Maven의
<parent>
, <DependencyManagement>
, <properties>
를 활용한 의존성 관리
- DependencyManagement가 등록되지 않은 라이브러리라면 버전 명시가 필요
- 애플리케이션 실행 방법
- main 클래스 실행 (IDE 사용)
- mvn 라이브러리 중에서 spring-boot:run 사용하거나, 메이븐
./mvnw spring-boot:run
, 메이븐 설치되어 있다면 mvn spring-boot:run
사용
- JAR 패키징 & java -jar
maven의 package 실행하면 jar파일 하나로 뭉쳐진다. 이를 우버자르, fatjar라고 부른다.
- 8080 포트가 사용중이라고 하면 끄거나, application.properties에
server.port=8081
과 같은 방식으로 변경한다.
- 코딩
1. 개발 툴: 개발에 유용한 기능 제공
- Spring-Boot-Devtools를 이용해 웹 브라우저를 자주 리로딩, 애플리케이션을 자주 재시작(빌드를 해서 apllication이 재실행되는 것)하는 것을 관리할 수 있다.
- 패키징 할 때 devtools는 무시되므로 그냥 해도 된다.
- 자동 설정
org.springframework.boot.autoconfigure.EnableAutoConfiguration
에 설정을 해두면 내가 원하는 Bean, Class 등을 적용할 수 있다.
- 애플리케이션과 자동설정 간에, 혹은 자동설정끼리 중복된 설정으로 오버라이딩을 하려고 한다면 application이 실행되지 않는다.
- 외부설정 파일: 코드에서 값을 밖으로 꺼내는 방법 제공
- application.properties에 설정을 해두면 원하는 값을 지정해두고 가져다 쓸 수 있다.
- resources > config라는 디렉토리 안에 있는 설정은 더 구체적인 설정으로 우선순위가 높다.
- jar 파일에 있으면 우선 순위가 낮고, 현재 apllication.properties에 있으면 우선순위가 높다. (가까운 위치에 있을수록 높다)
- 배포
1. 도커 이미지 빌드: 계층형 이미지 빌드 지원
- 계층형 이미지를 만들어줘서 기존 계층을 캐시로 재사용할 수 있기 때문에 효율적이다. application과 library, jvm을 나누어서 이미지를 생성한다.
- 도커 이미지 볼 때 string-boot:build-image로 생성하고
dive [이미지 이름]
이라는 docker dive 툴을 이용해 계층을 유용하게 볼 수 있다.
- 관리
1. Actuator: 애플리케이션 관련 데이터 및 모니터링 정보 제공
spring-boot-starter-actuator
라이브러리 등록 하면 /actuator/ 를 이용해 데이터를 볼 수 있다. /beans: 빈 조회, /configprops: 프로퍼티 정보 조회, /logger 유용
- management.endpoints.web.exposure.include=*
- 런타임 중에 DEBUG 모드로 바꾸어서 logger 검색할 수 있다.
- 스프링 부트 admin 서버 띄우기, actuator 기반
- https://github.com/codecentric/spring-boot-admin 참고해서 활용
- logger DEBUG 변경 더 쉽게 org.spring.framework.web 검색해서 바꿀 수 있다.
로또 미션 질문에 대한 피드백 정리
- 궁금했던 것에 대한 답변
- Q: 객체가 의존하고 있다는 것은?
A: A객체가 B객체를 의존하고 있다는 것은 A객체가 B객체를 사용하고 있다고 이해하면 된다!
- 그렇다면 지금 내가 구현한 바에 따르면, 컨트롤러에서 view에게 도메인 객체를 보내고 이를 사용하도록 하니 view가 domain을 의존하고 있다고 볼 수 있겠다.
요구사항에서 view 패키지의 객체가 domain 패키지 객체에 의존할 수 있다 했으니 우선은 괜찮은 것 같은데 생각을 더 해보는게 좋을 것 같다.
과연 view와 domain 사이에 의존성을 주입하는게 좋은 걸까?
- Q: 객체의 생성자에서 변수를 원하는 값으로 완전히 조작하는 것이 괜찮은가?
A: 게이츠가 생각하는 생성자의 역할은 객체의 멤버 변수를 초기하는 역할이기 때문에 이를 제외한 행동을 생성자에서 수행한다면 다시 생각해볼 것을 추천했다.
- 여기서 말씀하신 초기화의 범위는?? (재질문)
- Q: 패키지 설계 방식이 packge-by-feature 괜찮은가?
A: 프로그램이 크지 않고 복잡하지 않다면 layer도 충분하다고 생각하지만, 프로그램이 커지고 복잡해짐에 따라 한계는 분명히 존재한다고 생각한다. 그 한계가 올 때 feature 방식으로 전환해도 의미가 있을 것.