데브코스 백엔드 3기 18일차

월화! TIL 같이 올리기
build tool에 대해 자세한 내용을 알게되었고 SpringBoot CLI는 처음 써봐서 신기했다


SpringBoot

Build Tool

소스 코드에서 실행 가능한 애플리케이션을 자동 생성하는 프로그램
Building : 코드를 컴파일, 링크 및 패키징하여 사용 가능하거나 실행 가능한 형태로 통합

  • Maven : xml 기반으로 설정모델 제공(pom.xml)
  • Gradle


  • 라이브러리 다운 -> classpath에 추가
  • dependency 관리
    • Transitive Dependencies : 의존성의 의존성까지 관리해줌
      (a가 b 참고, b가 c 참조 => a는 c를 transitive 의존성으로 간주)
  • plugin과 외부라이브러리 분리해 관리
    • 플러그인에서 사용하는 라이브러리와 프로젝트에 사용하는 디펜던시가 섞이지 않게 해줌


  • 소스코드 컴파일
  • 테스트 실행
  • 컴파일된 코드 packaging -> jar/war/zip
  • packaging된 파일 = artifacts : 서버나 레파지토리에 배포


Maven

  • pom.xml : Maven이 Pom Object Model이라는 객체를 만드는거
  • coordinator : 개별 프로젝트 식별위한 좌표(group id, artifact id)
  • 멀티 모듈 가능
    • 여러개의 sub module도 가능 = 하나의 프로젝트 안에 sub project가능


SpringBoot project 만들기

(예전엔 Manual Setup : Maven/Gradle로 프로젝트 만들어서 pom.xml, build.gradle을 직접수정)

  1. SpringBoot CLI 이용
  2. Spring initializr(starter 이용해서 쉽게)


SpringBoot CLI

  • 설치
    1. spring-boot-cli-bin.zip 다운
    2. C:/Spring에 압축풀기
    3. 환경변수 3개(JAVA_HOME, SPRING_HOME, path 변수에 %SPRING_HOME%\bin경로


  • init -> .zip 파일 다운( + -x하면 압축풀려서 다운)
    • spring init --build maven -j 16 -g org.prgrms -a kdt -n kdt -x kdt
      • --build maven : maven으로 빌드
      • -j 16 : 자바버전 16
      • -g : group id
      • -a : artifact id
      • -n : project name
      • -x : 압축풀기


의존성

  1. 컴파일 시점의 의존성 : 코드를 작성하는 시점에서 발생(클래스 사이의 의존성)
    1) = 결합도가 높음 = 하나의 객체가 변경이 일어날 때 관계를 맺고있는 다른 객체에게 변화를 요함
  2. 런타임시점의 의존성 : 어플리케이션이 실행되는 시점에서 발생(객체 사이의 의존성)


  • 바람직한 의존성 : 느슨한 결합 => Interface 사용
    • ex) 코드에 특정객체를 넣어두는게 아닌, 런타임에 특정객체를 생성해서 전달



ApplicationContext

spring에서 ApplicationContext 라는 interface를 통해 IoC Container 제공해줌

제목 없음

  • BeanFactory(IoC의 기본기능이 들어있는) 상속받음
    • +) AOP / Resources Handling / Event Publication / Web Application Context


Bean

BeanFactory, IoC Container에 의해 관리되어지는 객체

  • ApplicationContext에 실제도 만들어야할 빈정보는 그럼 어디서?
    => Configuration Meta data로부터 받아와서 빈등록
  • meta data를 어떤형태로 받냐에 따라 다른 구현체
    • xml : GenericXmlApplicationContext 구현체 사용
    • 자바파일 : AnnotationConfigApplicationContext 구현체 사용



DDD(Domain Driven Design)

도메인 주도 설계

  • Domain : 사용자가 application을 사용하는 대상영역
    • 주로 비즈니스 그 자체
    • 주문관리 어플리케이션은 주문에 대한 관리자체가 도메인
  • 도메인객체는 복잡 -> 복잡성 해소 위해 모델만듬
  • 모델을 여러종류로 분류
    • Entity : 식별자(-> 개별성), 시간흐름에 따라 지속적으로 변경
    • Value Object : 불변객체
    • 주로 Entity들이 Vo를 속성으로 가지고 있음



자바계산기 PR 코드리뷰

  • 흑9님과 서브멘토 ㅎㅇ님이 남겨주신 코멘트들
    • 인터페이스를 왜 사용하고 어떻게 사용하여야 할까
    • 싱글톤은 어떤 클래스가 싱글톤이어야 할까
    • main 메소드를 컴퓨터가 운영체제를 실행해서 메모리를 할당해주는 작업과 비슷하게 생각해보자
      (아니면 소프트웨어를 시작하는데 전체의 큰 공간에서 필요한 자원들을 생성하고 넣어주는 작업을 떠올려 보자)
    • Enum(MenuType.java)에서 Enum.values() vs static map으로 초기화 방법
      • Java static의 장단점
    • for문 stream으로 변환 연습하기
    • 자바에서 제공해주는 Exception을 사용했을때 얻는 이점과 Customer한 Exception을 만들었을때 얻는 이점
    • if-else 가 두개 연속으로 쓰이면 의심해보자



회고(일기)

  • 뉴 훈팀이 되었다! 훈훈한 훈팀(내맘대로)
    구 흑구팀과 함께 만나보았다

    1031-2


  • 디자인패턴 스터디를 스프링 스터디로 바꾸었다
    인프런 김영한님 무료강의부터 시작!


  • 자바계산기 PR approve가 왔다
    사실 처음부터 왔었는데 PR 코드리뷰가 낯선 나,
    무조건 두번해야하는줄 알고 또 보냈다(또 해주심ㅎㅎ)
    사실 알았어도 또 보냈을듯 하지만ㅎ
    데브코스가 끝나고 지금의 코드를 다시 봐야지!


  • 드디어 맥북 겟!!!!!
    너무 좋아 세팅해야하는데 우선순위에서 밀리는중
    그냥 바라만 보고 있어도 좋다
    • 놓치지 않겠다는 의지

    KakaoTalk_20221102_151417962



ApplicationContext 사진출처
https://www.geeksforgeeks.org/spring-difference-between-beanfactory-and-applicationcontext/

업데이트: