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

수목! TIL 같이 올리기
Spring의 환경과 속성파일에 대해 배웠다


IoC

  • IoC 만드는 다양한방법
    • 전략패턴
    • 서비스로케이터패턴
    • 팩토리패턴
    • 의존관계주입패턴
      • 생성자주입 패턴
      • 세터기반의 의존관계 주입
  • 스프링 공식문서 : 생성자기반 의존관계주입 옹호
    • why?
      • 1)초기화시 필요한 모든의존관계 형성 -> 안전
      • 2) 잘못된 패턴 찾을 수 있게 도와줌
        (param 너무 많다면 = 많은책임 가진다는걸 암시 => 관심사 분리 필요의미)
      • 3) 테스트 쉽게해줌
      • 4) 불변성 확보


Annotation

  • @Bean : 직접 bean 등록
  • @ComponentScan : 스프링이 검색해서 빈등록해줌
  • StereoType annotaion
    • @Component
      • @Configuration : Java config = 단순한 클래스가 아닌 자바기반으로 메타데이터를 설정하는 클래스임을 알려줌
      • @Controller : Spring MVC
      • @Service : Service access
      • @Repository : Data access
  • @Autowired : IoC Container에 의해 자동 주입됨


Bean의 생성,소멸에 대한 콜백

  • 생성 : ApplicationContext applicationContext = new ApplicationContext;
    -> 빈 생성에 대한 콜백 동작
  • 소멸 : applicationContext.close();
    -> 컨테이너에 등록된 모든 빈 소멸
    -> 빈의 소멸에 대한 콜백 동작


Bean생성 생명주기 콜백

  1. @PostConstruct 적용된 메소드 호출
  2. Bean이 InitializingBean interface 구현 시 afterPropertiesSet 호출
  3. @Bean의 initMethod에 설정한 메소드 호출(@Bean(initMethod = “init”)


Bean소멸 생명주기 콜백
1.@PreDestroy 적용된 메소드 호출

  1. Bean이 DisposableBean interface 구현 시 destroy 호출
  2. @Bean의 destroyMethod에 설정한 메소드 호출



EnvironmentCapable

모든 ApplicationContext는 Environment를 제공함
개발환경/테스트환경/운영환경

  • 스프링의 환경은 프로파일과 프로퍼티로 제공됨
    = 환경에 따라서 profile과 properties가 다르게 설정된 Environment Object가 사용됨


Spring 속성파일

DB접속정보, 서버port, password 보안정보 등을 외부속성으로 관리하고 application이 읽어오게하기

  • 속성은 많은곳에 정렬가능 -> application에 로드
    • property 파일로 작성
      • .properties 확장자 가진 파일로 만들기
      • .yaml 파일
    • JVM System property로도 전달 가능
    • OS레벨 환경변수로 설정


application.properties

  • SpringBoot에서 default로 사용하는 프로퍼티파일
  • key = value로 작성
kdt.version = v1.1.1   
kdt.support-vendors = a, b, c, d


  • @Value : 프로퍼티파일에 정의한 property key에 대한 값을 필드에 주입 가능
@PropertySource("application.properties")
public class AppConfiguration {
    @Value("${kdt.version:v0.0.0}")
    private String version;


public Version(@Value("${kdt.version:v0.0.0}") String version) {
    this.version = version;
}


  • 환경변수를 가져오려면
    • 우선순위가 있음 = properties 파일에 JAVA_HOME key가 있어도 환경변수에 있다면 그걸 가져옴
@Value("${JAVA_HOME}")


application.yaml

kdt:
  version: "v1.1.1"
  support-vendors: 
      -a
      -b
      -c
  • : 뒤에 꼭 한칸 띄우기



Spring profile

특정한 특징 or 공통점을 찾아서 그룹화 = profile화

  • profile별로 property에 대한 변경가능(스프링부트가 지원)
    • @Profile("dev")



Resource

외부리소스(이미지, 텍스트, 암호화를 위한 키파일)를 파일시스템, 클래스패스, URL 이용(웹에서 다운로드)하여 사용가능
=> 스프링에서는 ResourceResourceLoader 인터페이스 제공함으로써 하나의 API 제공

  • 모든 ApplicationContext는 ResourceLoader interface 구현
    = Resource 객체를 가져올 수 있음
public class Test {
    ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfiguration.class);
    Resource resource1 = (Resource) applicationContext.getResource("classpath:application.yaml");
    Resource resource2 = (Resource) applicationContext.getResource("file:src/test/sample.txt");
    List<String> strings = Files.readAllLines(resource2.getFile().toPath());
    System.out.println(strings.stream().reduce("", (a, b) -> a + "\n" + b));
  • file은 루트경로에서부터
  • import org.springframework.core.io.Resource
    • javax의 Resource를 import해서 getFile()이 계속 없다고 떠서 한참 애먹었다ㅠㅠ 팀원분이 찾아주심!
      import를 할 때는 인텔리제이만 너무 믿지말고 정신을 똑바로 차리자~



일기(회고)

  • 할게 너무 많은데 강의듣고 궁금한것 찾아보는것만으로도 많은시간이 지나간다(와중에 맥북 마스터하기 핫핫)
    물론 스프링공부를 하게되어서 좋지만
    과제도 해야하고, cs공부도 하고싶고, 객사오책도 읽고싶고,
    알고리즘문제도 꾸준히 풀고싶은데 쉽지않다..!
    쉬운건 없으니 핑계 고만대고 다음주부터 적어도 이틀에 하나씩은 꼭 풀기!!
    어떻게 해야 시간을 효율적으로 쓸 수 있을까


  • TIL을 줄여볼까 싶었지만 주말에 복습을 위해선 써두는게 좋다는게 결론!
    대신 이틀에 한번씩, 더 간결하게 쓸 예정


  • 알고리즘은 어떻게 해야 잘할 수 있을까아
    많이 해봐야 한다! 라는말은 많이 들었는데 접근방식을 바꿔보고 싶은데 강의를 들어야하낭
    내일은 주변에 물어보아야지
    데브코스를 하고 제일 좋은점은 물어볼 사람이 많다는것


  • 오늘의 게더
    • 뉴 훈팀 방을 훈훈하게 꾸며보았다

    1102-1


업데이트: