본문 바로가기
BackEnd

5/28 - Spring

by Jiwon_Loopy 2025. 6. 1.
반응형

생성 후 작업


  • 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