스프링 부트 강의는 많은데 순수하게 spring만 알려주는 강의는 진짜 없다. 심지어 스프링 공식 다큐멘테이션 튜토리얼이었나 거기도 스프링 부트를 사용한다 ㅋ 근데 스프링 부트가 스프링을 어느정도 이해하고 써야지 좀 쓰는 맛이 날 거 같아서 스프링 강의 찾다가 유튜브에서 좋은 강의를 발견하게되어 하루만에 기초정도는 다 들었다. 그리고 되게 많은 것을 배웠다. 이게 무료라니..? 행운이다 진짜 좋은 세상이다.ㅎㅎ
AOP는 아직 때가 아닌 거 같아서 안들었다. ㅎㅎ 나중에 필요해지면 그때 들어야겠다.
https://youtube.com/playlist?list=PLq8wAnVUcTFUHYMzoV2RoFoY2HDTKru3T
시작 !
Spring framework
핵심기능
Dependency injection
transaction management
web apps
data access
messaging
and more
느슨한 결합력과 인터페이스
결합력이 높다 = 의존성이 높다
즉, 둘중 하나를 바꾸면 나머지 하나도 바꿔야함
외부파일을 가지고 객체를 다른 것으로 바꿀 수 있다.
(바꿀 객체와 바꿔지는 객체가 같은 인터페이스의 구현체일경우)
DI(Dependency Injection)
:(부품, dependency) 부품을 조립해준다, 종족성 주입
Dependency 조립의 두가지 형태? 방법
- composition has a - 클래스가 생성할때 같이 생성(일체형)
- association has a - 외부에서 생성해서 set (조립형) <= injection
DI가 왜 중요한가?
상-일체형 하-조립형(injection)
- 일체형보다 조립형이 결합력이 낮아지고 부품을 쉽게 갈아 끼울 수 있다.
- 일체형의 경우 부품이 뭔지 모른다. 바꿔 끼기도 어렵다
“조립형을 살것인가 완성품을 살것인가”
조립형은 내가 원하는대로 부품 업그레이드가능
그러나, 조립을 직접 해야한다는 단점이 있음
⇒ 그래서 스프링 나옴. 소스코드를 바꾸지 않아도 간편하게 원하는 부품을 조립해주는 기능이 있음 그게 스프링의 dependency injection
dependency를 조립하는데에 두가지 방법(일체형, 조립형) 이 있고 그중 하나가 injection.
또, injection에도 2가지 방법이 있다.
- Dependency injection의 두가지 방법
- construction injection
- setter injection
IoC컨테이너
주문서에 입력돼있는 내용대로 부품(객체)를 생성해서 담는 그릇
dependency container
일체형과 다르게 작은것 부터 만듦
역순(Inversion)으로 객체를 생성하는 컨테이너.
결합(조립)돼서 담겨지는 컨테이너
DI 손수해보기
메인
public class Program {
public static void main(String[] args) {
//TODO: 데이터 엔티티와 출력하는 클래스 추가
Exam exam = new NewlecExam();
//construction injection
ExamConsole console = new InlineExamConsole(exam);
ExamConsole console = new GridExamConsole(exam);
console.print();
//setter injection
InlineExamConsole console = new InlineExamConsole();
console.setExam(exam);
console.print();
//부품(여기선 다르게 출력하는 기능)을 바꿔끼려면 코드수정을 꼭 해야만한다...
}
}
public class InlineExamConsole implements ExamConsole {
private Exam exam;
// [construction injection]
public InlineExamConsole(Exam exam) {
this.exam = exam;
}
//[setter injection]
public void setExam(Exam exam) {
this.exam = exam;
}
public InlineExamConsole() {
// TODO Auto-generated constructor stub
}
@Override
public void print() {
System.out.printf("total is %d, avg is %f\n",exam.total(),exam.avg());
}
}
DI지시서 작성하기
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Exam exam = new NewlecExam();
ExamConsole console = new InlineExamConsole();
class= 어떤 클래스를 쓸건지 id = 어떤 이름으로 쓸건지 -->
<bean id="exam" class="spring.di.entity.NewlecExam" />
<bean id="console" class="spring.di.ui.InlineExamConsole">
<!-- 인젝션
console.setExam(exam)
name="메서드이름"
ref="파라미터"
setExam일 경우 set을 없애고 소문자로 시작하게 한다. 그러면 setExam을 부른다-->
<property name="exam" ref="exam"></property>
</bean>
</beans>
스프링 IoC 컨테이너 사용하기(ApplicationContext 이용하기) - 지시서 써보기
생성조립해주는 스프링기능의 구체적이름 ApplicationContext(인터페이스)
⇒ 컨테이너
<dependencies>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.22.RELEASE</version>
</dependency>
</dependencies>
이걸 maven project에 pom에 넣어줬더니 ApplicationContext를 import하는 게 가능해짐.
setting.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Exam exam = new NewlecExam();
ExamConsole console = new InlineExamConsole();
class= 어떤 클래스를 쓸건지 id = 어떤 이름으로 쓸건지 -->
<bean id="exam" class="spring.di.entity.NewlecExam" />
<bean id="console" class="spring.di.ui.GridExamConsole">
<!-- 인젝션
console.setExam(exam)
name="메서드이름"
ref="파라미터"
setExam일 경우 set을 없애고 소문자로 시작하게 한다. 그러면 setExam을 부른다-->
<property name="exam" ref="exam"></property>
</bean>
</beans>
```java
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- Exam exam = new NewlecExam();
ExamConsole console = new InlineExamConsole();
class= 어떤 클래스를 쓸건지 id = 어떤 이름으로 쓸건지 -->
<bean id="exam" class="spring.di.entity.NewlecExam" />
<bean id="console" class="spring.di.ui.GridExamConsole">
<!-- 인젝션
console.setExam(exam)
name="메서드이름"
ref="파라미터"
setExam일 경우 set을 없애고 소문자로 시작하게 한다. 그러면 setExam을 부른다-->
<property name="exam" ref="exam"></property>
</bean>
</beans>
```
ApplicationContext context =
new ClassPathXmlApplicationContext("spring/di/setting.xml");
ExamConsole console = (ExamConsole) context.getBean("console");
// ExamConsole console = context.getBean(ExamConsole.class);//명시된 타입의 bean이 2개라면 따로 처리할 방법 찾아야함
console.print();
값 형식 DI
Autowired Annotation
설정을 열어서 바꾸는 것도 이제 귀찮
객체를 새로 만들면 그냥 알아서 바꼈으면 좋겠음
⇒ 코드에다가 설정을 심는 형식으로 바뀜
해당 메서드에 @Autowired하면 정상적으로 됨
근데 의문점. 도대체 뭘 연결하는거지?
xml에서는 정확히 무엇을 연결하라고 명시를 해줬지만 오토와이어드는 그렇지 않다!
@Autowired의 동작방식 이해와 @Qualifier 사용하기
결과적으로 @Autowired 위치는 3군데
- 기본생성자
- 오버로드생성자
- 세터
기본생성자에 autowired를 하게되면 기본생성자를 호출해서 객체를 생성 뒤 넣어줌
특화된 @Component 어노테이션 (@Controller/@Service/@Repository)
객체에 초기값 지정하기
이런식
근데 사실 저런 엔티티에 어노테이션을 붙이는 것은 개념상 맞지 않다.
MVC에서 쓰는게 바람직.
뭐 암튼 이렇게 우리는 우리가 갖고있는 소스코드들에 어노테이션을 붙일수가있다.
그러나 우리는 다른 외부 클래스도 갖고와서 써야한다. 그럼 그렇게 하기위해 외부꺼는 xml로 내부꺼는 어노테이션으로 해야하느냐?
아니다. xml을 자바 config로 옮겨오면 xml이 필요 없어진다는데… to be continued 😎
XML Configuration을 Java Configuration으로 변경하기
유후~!
'study > Spring' 카테고리의 다른 글
spring boot jsp dependency (0) | 2022.06.28 |
---|---|
데이터 Json / form을 객체로 받기 (0) | 2022.06.24 |
gson으로 JsonObject List로 바꾸기 (0) | 2022.06.24 |
Spring Security csrf disable (0) | 2022.06.22 |
AmigosCode SpringBoot tutorial 2021 정리 (0) | 2022.05.24 |
댓글