[우아한테크코스] 2월 20일 TIL

2 minute read

오늘 배운 것

  1. 강의 - 우아한 스프링 부트
  2. 미션 - 로또 미션 피드백 정리
  3. 독서 - 객체 지향의 사실과 이해

우아한 스프링 부트

  • 스프링 부트가 다루는 영역
    • 빌드: 프로젝트 생성, 의존성 관리, 애플리케이션 패키징 및 실행
    • 코딩: 개발 툴 제공, 자동 설정, 외부 설정
    • 배포 및 관리: 도커 이미지 생성, actuator, 스프링 부트 어드민
      1. 빌드
        1. 프로젝트 생성
        • 빌드툴(gradle, maven) 선택
        • 언어(java, kotlin, groovy) 선택
        • 버전(스냅샷: 개발 중, m2: 배포했지만 변경 가능 있는 것, 아무것도 없는 것: 권장) 선택
        • 프로젝트 메타데이터: group, artifact, version, package(Java ARcive, Web Application aRchive)
        • 의존성 선택
          1. 의존성 관리
        • springboot-starter-thymeleaf의 버전이 dependency가 되어있으므로 그 자식들이 버전으로 들어오는 것이다.
        • 스프링부트가 내가 사용하고자 하는 의존성에 적합한 버전을 알아서 찾아준다.
        • Maven의 <parent>, <DependencyManagement>, <properties>를 활용한 의존성 관리
        • DependencyManagement가 등록되지 않은 라이브러리라면 버전 명시가 필요
          1. 애플리케이션 실행 방법
        • 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과 같은 방식으로 변경한다.
      2. 코딩 1. 개발 툴: 개발에 유용한 기능 제공
        • Spring-Boot-Devtools를 이용해 웹 브라우저를 자주 리로딩, 애플리케이션을 자주 재시작(빌드를 해서 apllication이 재실행되는 것)하는 것을 관리할 수 있다.
        • 패키징 할 때 devtools는 무시되므로 그냥 해도 된다.
          1. 자동 설정
        • org.springframework.boot.autoconfigure.EnableAutoConfiguration에 설정을 해두면 내가 원하는 Bean, Class 등을 적용할 수 있다.
        • 애플리케이션과 자동설정 간에, 혹은 자동설정끼리 중복된 설정으로 오버라이딩을 하려고 한다면 application이 실행되지 않는다.
          1. 외부설정 파일: 코드에서 값을 밖으로 꺼내는 방법 제공
        • application.properties에 설정을 해두면 원하는 값을 지정해두고 가져다 쓸 수 있다.
        • resources > config라는 디렉토리 안에 있는 설정은 더 구체적인 설정으로 우선순위가 높다.
        • jar 파일에 있으면 우선 순위가 낮고, 현재 apllication.properties에 있으면 우선순위가 높다. (가까운 위치에 있을수록 높다)
      3. 배포
        1. 도커 이미지 빌드: 계층형 이미지 빌드 지원
        • 계층형 이미지를 만들어줘서 기존 계층을 캐시로 재사용할 수 있기 때문에 효율적이다. application과 library, jvm을 나누어서 이미지를 생성한다.
        • 도커 이미지 볼 때 string-boot:build-image로 생성하고 dive [이미지 이름]이라는 docker dive 툴을 이용해 계층을 유용하게 볼 수 있다.
      4. 관리 1. Actuator: 애플리케이션 관련 데이터 및 모니터링 정보 제공
        • spring-boot-starter-actuator 라이브러리 등록 하면 /actuator/ 를 이용해 데이터를 볼 수 있다. /beans: 빈 조회, /configprops: 프로퍼티 정보 조회, /logger 유용
        • management.endpoints.web.exposure.include=*
        • 런타임 중에 DEBUG 모드로 바꾸어서 logger 검색할 수 있다.
          1. 스프링 부트 admin 서버 띄우기, actuator 기반
        • https://github.com/codecentric/spring-boot-admin 참고해서 활용
        • logger DEBUG 변경 더 쉽게 org.spring.framework.web 검색해서 바꿀 수 있다.

로또 미션 질문에 대한 피드백 정리

  1. 궁금했던 것에 대한 답변
    • Q: 객체가 의존하고 있다는 것은?
      A: A객체가 B객체를 의존하고 있다는 것은 A객체가 B객체를 사용하고 있다고 이해하면 된다!
      • 그렇다면 지금 내가 구현한 바에 따르면, 컨트롤러에서 view에게 도메인 객체를 보내고 이를 사용하도록 하니 view가 domain을 의존하고 있다고 볼 수 있겠다.
        요구사항에서 view 패키지의 객체가 domain 패키지 객체에 의존할 수 있다 했으니 우선은 괜찮은 것 같은데 생각을 더 해보는게 좋을 것 같다.
        과연 view와 domain 사이에 의존성을 주입하는게 좋은 걸까?
    • Q: 객체의 생성자에서 변수를 원하는 값으로 완전히 조작하는 것이 괜찮은가?
      A: 게이츠가 생각하는 생성자의 역할은 객체의 멤버 변수를 초기하는 역할이기 때문에 이를 제외한 행동을 생성자에서 수행한다면 다시 생각해볼 것을 추천했다.
      • 여기서 말씀하신 초기화의 범위는?? (재질문)
    • Q: 패키지 설계 방식이 packge-by-feature 괜찮은가?
      A: 프로그램이 크지 않고 복잡하지 않다면 layer도 충분하다고 생각하지만, 프로그램이 커지고 복잡해짐에 따라 한계는 분명히 존재한다고 생각한다. 그 한계가 올 때 feature 방식으로 전환해도 의미가 있을 것.