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을 많이 만나게 될 예정!!
[!quote] 이제 우리는, 스프링을 사용하는 것을 통해
서블릿이 아니더라도 웹 서비스를 충분히 제공할 수 있게 되었다. >(HttpServletRequest,respont 상속받지 않아도 됨!)
느슨한 결합을 위해 상속을 포기한다.
✅ 구체적인 클래스 타입을 알지 못해도 그 클래스의 정보(메소드, 타입, 변수, ...)에 접근할 수 있도록 해주는 API
컴파일 타임(정적)이 아니라 런타임(정적)에 출력할 수 있음
객체를 통해 클래스의 정보를 분석하여 런타임에 클래스의 동작을 검사하거나 조작하는 프로그램 기법
언제 쓰인다고? ==동적으로== 클래스를 사용해야 할 때, 작성시점에는 모르지만 런타임 시점에서 가져와 실행할 때 필요하다.
이처럼 스프링이나 IDE(개발도구)에서 동적 바인딩을 지원한다.
패키지 이름 : java.lang.reflection
[!quote] Reflection API 왜 쓸까?
프로그램 진행 중에 변경할 수 있어 유리하고, 유연하게 처리할 수 있다!
런타임 정보를 분석하거나 다형성을 구현하고, 프레임워크에서 빈을 관리하는 것에 도움이 된다.
- HiKariCP 추가 (참고 : https://adjh54.tistory.com/73)
- HiKariCP는 데이터베이스 연결(Connection)을 관리해 주는 도구(라이브러리) 첫번째 방법
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
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로 실습해 보았음. 프로젝트의 클래스를 미리 등록하고, 그 클래스 정보를 스캔(메소드 등)하고, 사용 할 때 불러와서 사용할 수 있게 해주는 역할을 한다.
- 우선 우리가 알고 있는 디형성은?!
✅ 선언부, 생성부 이름이 다름, 객체지향 프로그래밍의 꽃!!
Duck duck = new RubberDuck();
인터페이스 인터페이스변수 = new 구현체클래스();
이렇게 선언부, 생성부 이름이 다른 것을 다형성이라고 함.
왜 쓰지??
큰 틀은 인터페이스로 지정해두며, 그것을 각 구현체 클래스에서 사용할 수 있도록 하여 보다 코드 재사용성을 높일 수 있음.
- 스프링에서 우리가 알고 있던 다형성까지 적용하면 코드 작성이 ==더욱 더 유연해진다==
기존 방식의 문제점?😭
- [[컴포넌트]](즉, 특정 기능을 수행하는 모듈) 간 결합도가 높아서 컴포넌트 확장 및 재사용에 어려운 문제가 발생한다.
하지만 [[IoC]]를 사용한다면?
- 제어권이 스프링 컨테이너에 넘어가며, 객체(Bean🫛)의 생명주기를 전담하게 됨.
- 컴포넌트 간 직접 연결을 하는 것이 아니라 스프링 컨테이너에서 의존성을 주입받아 사용
- 클래스(빈)의 등록 및 관리를 스프링이 하며, 나는 이것을 적재적소에 꺼내어서 사용하면 되는 것이다!!