[2023.12.19] 개발자 교육 62일 차 : 강의-Spring Boot 실습 [구디 아카데미]

DaramGee·2023년 12월 19일
0

복습

DEMO 스프링 부트 프로젝트

  • 스프링 애플리케이션 설정 : 개발 환경, 외부 설정, 애플리케이션 관리 가능

  • application.properties - Properties 클래스 동일(반복되는 코드들이 많아 최근은 사용량 감소 중)
    - 키-값(key-value) 쌍으로 저장하는 데 사용
    - 연결정보, 서버,포트, 로깅수준 등

  • application.yml - json 형식 (반복코드 생략 가능)
    - YAML(YAML Ain't Markup Language) 형식으로 작성된 설정 파일
    - 구조화, 계층적 표현에 좋음
    - JSONrhk dbtkgks rnwh

  • 프로젝트 설정

    	- Tomcat 10.1.16 -> Dynamic Web Application 6.0 버전 -> javax패키지 사용 x, jakarta 패키지 o
    	- 스프링 부트에서 서블릿 실습 위해서는 -> @ServletComponentScan 추가 필요
  • 스프링 프레임워크?

  • Core : core.jar : 제어의 역행 지원([[IoC]])

  • [[Bean]] contatiner(bean.jar) : bean 태그 붙임, 게으른 생성, 필요할 때 주입해 줌!!([[DI]])
    - 늦은 인스턴스화(getBean 호출해야 생성)

  • Context contatiner(application context) : bean팩토리의 자식개념
    - 클래스를 선언(xml) 및 생성 & 메모리에 미리 로딩해 둠.(이른 인스턴스화-서버 연결 시 바로 생성)
    - Bean들의 라이프사이클을 관리

  • 자바에서 NullExeption을 만났다면, 스프링에서는 BeanException을 많이 만나게 될 예정!!


@어노테이션

컨트롤계층을 지원하는 어노테이션

@Controller -> 페이지로 출력

  • 메소드 이름이 페이지 이름이 됨.
  • 화면 직접 처리 시 사용

@RestController -> 문자열로 출력

  • text/plain or 페이지 출력 아닌 모든 경우에 사용 가능(json포함)
  • UI, json 활용 필요 시 사용

[!quote] 이제 우리는, 스프링을 사용하는 것을 통해
서블릿이 아니더라도 웹 서비스를 충분히 제공할 수 있게 되었다. >(HttpServletRequest,respont 상속받지 않아도 됨!)
느슨한 결합을 위해 상속을 포기한다.


Java의 클래스

클래스 객체 얻기- 기존 3가지 방법

  • Object.getClass() : 최상위 클래스 Object의 메소드로, 인스턴스화 된 클래스만 가져올 수 있다.
  • .class 리터럴로 얻기 : 컴파일만 되었어도 가져올 수 있다(simple)
  • Class.forName() : 컴파일된 클래스 파일이 있으면 이름으로 가져올 수 있다. 단, 이름이 정확히 일치해야한다.
    => forName()만 런타임 시 불러오는 동적 로딩 -> 예외처리 필요

Reflection API

✅ 구체적인 클래스 타입을 알지 못해도 그 클래스의 정보(메소드, 타입, 변수, ...)에 접근할 수 있도록 해주는 API


  • 컴파일 타임(정적)이 아니라 런타임(정적)에 출력할 수 있음

  • 객체를 통해 클래스의 정보를 분석하여 런타임에 클래스의 동작을 검사하거나 조작하는 프로그램 기법

  • 언제 쓰인다고? ==동적으로== 클래스를 사용해야 할 때, 작성시점에는 모르지만 런타임 시점에서 가져와 실행할 때 필요하다.

  • 이처럼 스프링이나 IDE(개발도구)에서 동적 바인딩을 지원한다.

  • 패키지 이름 : java.lang.reflection

[!quote] Reflection API 왜 쓸까?
프로그램 진행 중에 변경할 수 있어 유리하고, 유연하게 처리할 수 있다!
런타임 정보를 분석하거나 다형성을 구현하고, 프레임워크에서 빈을 관리하는 것에 도움이 된다.


강의 내용

프로젝트 의존성 수정

  • DB연결

    	- HiKariCP 추가 (참고 : https://adjh54.tistory.com/73)
    - HiKariCP는 데이터베이스 연결(Connection)을 관리해 주는 도구(라이브러리)
    - HiKariCP에서 커넥션 풀(Connection Pool)이 설정된 커넥션의 사이즈만큼의 연결을 허용하며 HTTP 요청에 대해 순차적으로 DB 커넥션을 처리해 주는 기능을 수행
    - 가볍고 빠르게 처리할 수 있다는 장점
    - yml 수정 시 두 가지 방법 중 통하는 방법으로 사용
    - 관련 어노테이션 @Configuration
 첫번째 방법
 datasource:
    hikari:
      jdbc-url: jdbc:oracle:thin:@127.0.0.1:1521/orcl11
      username: mblog
      password: mblog
      driver-class-name: oracle.jdbc.OracleDriver
      connection-timeout: 20000
      validation-timeout: 3000
      minimum-idle: 5
      maximum-pool-size: 12
      idle-timeout: 300000
      max-lifetime: 1200000
      auto-commit: true
      pool-name: oraPool


두번째 설정 방법

  datasource:
    url: jdbc:oracle:thin:@localhost:1521/orcl11
    username: mblog
    password: mblog
    driver-class-name: oracle.jdbc.OracleDriver
    hikari:
      connection-timeout: 20000
      validation-timeout: 3000
      minimum-idle: 5
      maximum-pool-size: 12
      idle-timeout: 300000
      max-lifetime: 1200000
      auto-commit: true
      pool-name: oraPool
  • 804페이지 그림 외우기![[Pasted image 20231219103125.png]]
  • Dao![[Excalidraw/Dao|Dao|1000]]

어노테이션 실습(di2 패키지-Application Context & Bean 역할 흉내내보기)

  • MyConfig.java를 통한 빈 등록 및 라이프 사이클 관리(@Configuration & @Bean 사용)
    - TestController, Logic, Dao 클래스 등록

  • ApplicationContext(싱글톤, 미리 로딩)
    - @Configuration : xml 문서 대신 자바 클래스를 미리 선언 및 생성하여 등록해 둔다! (이른 객체 생성)
    - 어노테이션을 붙여 미리 생성해둔다. => 스프링에서 관리한다.(스캔, 정보 수집)
    - 이 때, @Bean어노테이션과 함께 사용한다. (메소드를 통해 객체를 주입받는 방법이 권장되고 있음)
    - Application context 컨테이너가 등록된 빈을 관리한다.

  • BeanFactory(게으른 로딩)
    - @Bean
    - Bean을 찾을 때, 이름으로 찾기 or 타입으로 찾기 가능함.
    - 게으른 인스턴스화? getBean 할 때 되어서야 생성

  • MyContext.java
    - @bean븥은 메소드 이름을 map에 저장 -> 추후 getBean(id)으로 사용 가능
    - @bean 붙은 메소드 타입으로 getBean(type)으로 사용 가능

  • 이렇게 스프링에서 두 컨테이너(Application Context & Bean)가 하는 역할을 di2로 실습해 보았음. 프로젝트의 클래스를 미리 등록하고, 그 클래스 정보를 스캔(메소드 등)하고, 사용 할 때 불러와서 사용할 수 있게 해주는 역할을 한다.


싱글톤 흉내내보기(di 패키지 - 예전 오리 예제 🦆)

  • 스프링 프레임워크에서의 다형성의 의미?

- 우선 우리가 알고 있는 디형성은?!

✅ 선언부, 생성부 이름이 다름, 객체지향 프로그래밍의 꽃!! 

  • Duck duck = new RubberDuck();

  • 인터페이스 인터페이스변수 = new 구현체클래스();

  • 이렇게 선언부, 생성부 이름이 다른 것을 다형성이라고 함.

왜 쓰지??
큰 틀은 인터페이스로 지정해두며, 그것을 각 구현체 클래스에서 사용할 수 있도록 하여 보다 코드 재사용성을 높일 수 있음.
- 스프링에서 우리가 알고 있던 다형성까지 적용하면 코드 작성이 ==더욱 더 유연해진다==

  • 기존 방식의 문제점?😭
    - [[컴포넌트]](즉, 특정 기능을 수행하는 모듈) 간 결합도가 높아서 컴포넌트 확장 및 재사용에 어려운 문제가 발생한다.

  • 하지만 [[IoC]]를 사용한다면?
    - 제어권이 스프링 컨테이너에 넘어가며, 객체(Bean🫛)의 생명주기를 전담하게 됨.
    - 컴포넌트 간 직접 연결을 하는 것이 아니라 스프링 컨테이너에서 의존성을 주입받아 사용
    - 클래스(빈)의 등록 및 관리를 스프링이 하며, 나는 이것을 적재적소에 꺼내어서 사용하면 되는 것이다!!


0개의 댓글