반응형
생성 후 작업
- pom.xml 수정
- java version 11로 세팅
- spring 버전 5.2.25.RELEASE로
- configureation target, source 11로
스프링 프레임 워크 특징
- EJB보다 가볍고 배우기도 쉬우며 경량 컨테이너의 기능 수행
- 제어 역행 기술을 이용해 애플리케이션 간 느슨한 결합 제공
- 의존성 주입 기능 지원
- 관점 지향 기능을 이용해 자원 관리
- 영속성과 관련된 다양한 서비스 지원
- 수많은 라이브러리 연동 지원
의존성 주입 (DI)
- 빈
- 스프링에서 관리하는 객체를 빈(Bean)이라고 부름
- 빈 설정 및 관리
- 설정 방식
- xml 방식
- java 방식 (spring 4.x이후)
- id는 이름
- class는 속성
- xml 예제
- greet라는 이름의 bean을 class와 연결시키는 예제
- 확인해보기
package chap01;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainByXml {
public static void main(String[] args) {
// 컨텍스트 객체 생성
// beans.xml 설정파일을 읽어서 greet라는 이름을 객체(빈) 생성, 빈컨테이너에 저장
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("chap01/beans.xml");
// 빈 객체 꺼내기
Greet g = (Greet)ctx.getBean("greet");
System.out.println(g.hello());
Greet g2 = ctx.getBean("greet", Greet.class);
System.out.print(g == g2);
}
}
출력 결과
안녕하세요
true
- setName을 통해 실행 후에 set하기
package chap01;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainByXml {
public static void main(String[] args) {
// 컨텍스트 객체 생성
// beans.xml 설정파일을 읽어서 greet라는 이름을 객체(빈) 생성, 빈컨테이너에 저장
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("chap01/beans.xml");
Greet g3 = ctx.getBean("greet2", Greet.class);
System.out.println(g3.greet());
}
}
<?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">
<bean id="greet" class="chap01.Greet" ></bean>
<!-- 객체 생성 후 setName() 호출해서 -->
<bean id="greet2" class="chap01.Greet" >
<property name ="name" value="홍길동"></property>
</bean>
</beans>
package chap01;
import lombok.Data;
@Data
public class Greet {
private String name;
public String greet() {
return name;
}
}
- 생성자로 초기화 하기
package chap01;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainByXml {
public static void main(String[] args) {
// 컨텍스트 객체 생성
// beans.xml 설정파일을 읽어서 greet라는 이름을 객체(빈) 생성, 빈컨테이너에 저장
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("chap01/beans.xml");
Greet g4 = ctx.getBean("greet3", Greet.class);
System.out.println(g4.greet());
}
}
<?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">
<bean id="greet3" class="chap01.Greet" >
<constructor-arg value="김길동"></constructor-arg>
</bean>
</beans>
package chap01;
import lombok.Data;
@Data
public class Greet {
private String name;
public Greet(String name) {
this.name = name;
}
public String greet() {
return name;
}
}
- java 예제
package chap01;
import org.springframework.context.annotation.*;
// 설정 파일
@Configuration
public class Config {
//빈 등록
// 메서드명이 빈 이름으로 등록
@Bean
public Greet greet() {
return new Greet();
}
}
package chap01;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MainByJava {
public static void main(String[] args) {
// 컨텍스트 객체 생성
// beans.xml 설정파일을 읽어서 greet라는 이름을 객체(빈) 생성, 빈컨테이너에 저장
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
Greet g = (Greet)ctx.getBean("greet");
System.out.println(g.hello());
}
}
출력 결과
안녕하세요
- 위 xml과 동일하게 설정
- xml과 동일한 방식이며, 동일한 결과가 출력됨
package chap01;
import org.springframework.context.annotation.*;
// 설정 파일
@Configuration
public class Config {
//빈 등록
// 메서드명이 빈 이름으로 등록
@Bean
public Greet greet() {
return new Greet();
}
@Bean
public Greet greet2() {
Greet g = new Greet();
g.setName("홍길동");
return g;
}
@Bean
public Greet greet3() {
return new Greet("김길동");
}
}
실제 서비스 예시
package chap02;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Config {
@Bean
public MemberDAO memberDao() {
return new MemberDAO();
}
@Bean
public MemberService memberService() {
MemberServiceImpl service = new MemberServiceImpl();
service.setDao(memberDao());
return service;
}
}
package chap02;
public class MemberDAO {
public void listMembers() {
System.out.println("회원정보 조회");
}
}
package chap02;
public interface MemberService {
void listMembers();
}
package chap02;
public class MemberServiceImpl implements MemberService {
private MemberDAO dao;
public void setDao(MemberDAO dao) {
this.dao = dao;
}
@Override
public void listMembers() {
MemberDAO dao = new MemberDAO();
dao.listMembers();
}
}
<?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">
<bean id="memberDao" class="chap02.MemberDao" ></bean>
<bean id ="memberService" class="chap02.MemberServiceImpl">
<property name="dao" ref="memberDao"></property>
</bean>
</beans>
- xml
package chap02;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class MainByXxml {
public static void main(String args[]) {
ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("chap02/beans.xml");
//Service 객체를 꺼내 메서드 실행
MemberService service = (MemberService)ctx.getBean("memberService");
service.listMembers();
}
}
- java
package chap02;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class MemberByJava {
public static void main(String args[]) {
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
//Service 객체를 꺼내 메서드 실행
MemberService service = (MemberService)ctx.getBean("memberService");
service.listMembers();
}
}
Component Scan
- 해당 패키지 아래 클래스들을 스캔하여 모두 bean으로 등록
- @Component 어노테이션이 붙어있는 class들만 등록
package ch03;
import org.springframework.context.annotation.*;
// 설정 파일
@Configuration
@ComponentScan(basePackages = "chap03")
public class Config {
}
package ch03;
import org.springframework.stereotype.Component;
@Component
public class MemberDAO {
public void listMembers() {
System.out.println("회원정보 조회");
}
}
주입
- Controller : @Controller
- Service : @Service
- DAO : @Repository
- VO : X
- Qualifier를 통해 같은 이름의 빈을 이름을 다르게 주어 주입할 수 있다.
- 특정 빈 이름 주입
- 중복 주입 해결
- @Componet를 주석처리하고 갈아끼워줘도 됨
메모
- Spring Legacy Project → Spring MVC Project
- src/main/java
- 소스코드
- src/main/resources
- static
- xml
- property
- test/java, test/resource
- 테스트 코드
- src
- webapp
- pom.xml
- Maven 설정
- jar
- lib로 들어감
- 서비스에 @Component를 쓰면 안된다!
- 호출 순서
- 컨트롤러 → 서비스 → DAO
728x90
반응형
'BackEnd' 카테고리의 다른 글
| 5/30 - Spring, AspectJ (1) | 2025.06.01 |
|---|---|
| 5/29 - MVC (0) | 2025.06.01 |
| 5/27 - ajax, JSON (4) | 2025.06.01 |
| 5/26 - JSTL (0) | 2025.06.01 |
| 5/23 - 서블릿, 쿠키와 세션, 필터와 리스너, JSP (0) | 2025.06.01 |