본문 바로가기
WEB/Spring

[Spring] Spring DI + 예제 실습

by 댕꼬 2022. 4. 16.
728x90

Spring DI

: 설정파일 또는 어노테이션을 통해서 객체간의 의존관계를 설정할 수 있다. 따라서 객체는 의존하고 있는 객체를 직접 생성하거나 검색할 필요가 없다.


DI 용어정리

 

- 스프링이 IoC방식으로 관리하는 오브젝트, 스프링이 직접 생성와 제어를 담당한다.

 

빈 팩토리(Bean Factory)

-  스프링이 IoC를 담당하는 핵심 컨테이너로, Bean을 등록, 생성, 조회, 반환하는 기능을 담당한다.

- 일반적으로 BeanFactory를  바로 사용하지 않고 이를 확장한 ApplicationContext를 이용한다.

 

애플리케이션 컨텍스트(Application Context)

- BeanFactory를 확장한 IoC컨테이너로, Bean을 등록하고 관리하는 기본적인 기능은  BeanFactory와 동일하다.

- 스프링이 제공하는 각종 부가서비스를 추가로 제공한다.

- BeanFactory라고 부를 때에는 주로 빈의 생성과 제어의 관점에서 이야기하는 것이고, Application Context라고 할 때는 스프링이 제공하는 애플리케이션 지원기능을 모두 포함해서 이야기 하는것으로 간주한다.

 

설정정보/설정메타정보(Configuration metadata)

- 스프링의 설정정보란 ApplicationContext 또는 BeanFactory가 IoC를 적용하기 위해 사용하는 메타정보를 말한다. 

- 설정정보는 IoC컨테이너에 의해 관리되는 Bean객체를 생성하고 구성할때 사용된다.

 

스프링 프레임워크

- 스프링 프레임워크는 IoC컨테이너, Application Context를 포함해서 스프링이 제공하는 모든기능을 통틀어 말할 때 주로 사용

 

 

빈 생성범위

<bean id="~~" class="~~~~" scope="prototype">과 같이 지정해준다.

범위 설명
singleton 기본값, 스프링 컨테이너당 하나의 인스턴스 빈만 생성
prototype 컨테이너에 빈을 요청할 때 마다 새로운 인스턴스 생성
request HTTP Request별 새로운 인스턴스 생성
session HTTP Session별 새로운 인스턴스 생성

 

스프링 빈 설정 방법

 

XML

- xml문서 형대로 빈의 설정메타 정보 기술

- 단순하며 사용하기 쉽고, 가장많이 사용하는 방식이다

- <bean>태그를 통해 세밀한 제어 가능

 

ex) <bean id="userDao"  class="com.test.hello.service.UserServiceImpl" scope="prototype">

         <property name="UserDao"  ref="UserDao"/>

     </bean>

 

 

Annotation

- 어플리케이션의 규모가 커지고 빈의 개수가 많아질 경우 XML파일을 관리하는 것이 번거로움

- 빈으로 사용될 클래스에 annotation을 부여해주면 자동으로 빈 등록 가능

- annotation으로 빈을 설정할 경우 반드시 component-scan을 설정해야 한다 

 

Stereotype 적용대상
@Repository Data Access Layer의 DAO 또는 Repository클래스에  사용
DataAccessException 자동변환과 같은 AOP의 적용대상을 선정하기 위해   사용
@Service Service Layer의 클래스에 사용
@Controller Presentation Layer의 MVC  Controller에 사용
스프링 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 설정
@Component 위의 Layer 구분을 적용하기 어려운 일반적인 경우에 설정

 

 

Spring Framework기반 도서정보 관리 애플리케이션


요구사항

- spring legacy 기반의 프로젝트 

- springframework 버전 5 이상, JRE버전 1.8

- junit 버전 4.13.

- 기본 logger의 레벨 : debug

- interfacee에 선언된 메서드의 구현은 자동생성되는 코드로 구현 

- UserServiceImpl은 UserRepo를 has a 관계로 포함하는데 생성자를 통해서 주입받는다.

- BookServiceImpl은 BookRepo를 has a 관계로 포함하는데 setter메서드를 통해 주입받는다

- 프로젝트 구조

DTO

 

Book.java

package com.ssafy.ws.dto;

import java.io.Serializable;

public class Book implements Serializable{
	
	private String isbn;
	private String title;
	private String author;
	private int price;
	private String content;
	private String image;
	
	public Book() {
		super();
	}
	
	public Book(String isbn, String title, String author, int price, String content, String image) {
		super();
		this.isbn = isbn;
		this.title = title;
		this.author = author;
		this.price = price;
		this.content = content;
		this.image = image;
	}
	
	public String getIsbn() {
		return isbn;
	}
	public void setIsbn(String isbn) {
		this.isbn = isbn;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getAuthor() {
		return author;
	}
	public void setAuthor(String author) {
		this.author = author;
	}
	public int getPrice() {
		return price;
	}
	public void setPrice(int price) {
		this.price = price;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}
	public String getImage() {
		return image;
	}
	public void setImage(String image) {
		this.image = image;
	}

	@Override
	public String toString() {
		return "Book [isbn=" + isbn + ", title=" + title + ", author=" + author + ", price=" + price + ", content="
				+ content + ", image=" + image + "]";
	}
	
}

User.java

package com.ssafy.ws.dto;

import java.io.Serializable;

public class User implements Serializable{
	
	private String id;
	private String name;
	private String pass;
	private String rec_id;
	
	public User() {
		super();
	}

	public User(String id, String name, String pass, String rec_id) {
		super();
		this.id = id;
		this.name = name;
		this.pass = pass;
		this.rec_id = rec_id;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPass() {
		return pass;
	}

	public void setPass(String pass) {
		this.pass = pass;
	}

	public String getRec_id() {
		return rec_id;
	}

	public void setRec_id(String rec_id) {
		this.rec_id = rec_id;
	}

	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", pass=" + pass + ", rec_id=" + rec_id + "]";
	}
	
}

 

repo

 

BookRepo.java

package com.ssafy.ws.model.repo;

import java.util.List;

import com.ssafy.ws.dto.Book;

public interface BookRepo {

	int insert(Book book);
	int update(Book book);
	int delete(String isbn);
	Book select(String isbn);
	List<Book> search();
}

BookRepoImpl.java

package com.ssafy.ws.model.repo;

import java.util.List;

import org.springframework.stereotype.Repository;

import com.ssafy.ws.dto.Book;

@Repository
public class BookRepoImpl implements BookRepo {

	@Override
	public int insert(Book book) {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public int update(Book book) {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public int delete(String isbn) {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public Book select(String isbn) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public List<Book> search() {
		// TODO Auto-generated method stub
		return null;
	}
}

UserRepo.java

package com.ssafy.ws.model.repo;

import com.ssafy.ws.dto.User;

public interface UserRepo {
	User select(String id);

}

UserRepoImpl.java

package com.ssafy.ws.model.repo;

import org.springframework.stereotype.Repository;

import com.ssafy.ws.dto.User;

@Repository
public class UserRepoImpl implements UserRepo{

	@Override
	public User select(String id) {
		// TODO Auto-generated method stub
		return null;
	}
	
}

service

 

BookService.java

package com.ssafy.ws.model.service;

import java.util.List;

import com.ssafy.ws.dto.Book;

public interface BookService {
	
	int insert(Book book);
	int update(Book book);
	int delete(String isbn);
	Book select(String isbn);
	List<Book> search();
}

BookServiceImpl.java

package com.ssafy.ws.model.service;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ssafy.ws.dto.Book;
import com.ssafy.ws.model.repo.BookRepo;

/**
 * 빈으로 등록될 수 있도록 @Service를 선언한다.
 */
@Service
public class BookServiceImpl implements BookService {
	/**
	 * has a 관계로 사용할 BookRepo 타입의 repo를 선언한다.
	 */
	private BookRepo repo;
	
	/**
	 * setter를 통해 BookRepo를 주입받는다.
	 * @Autowired를 통해 BookRepo 타입의 빈을 주입 받는다.
	 * @param repo
	 */
	@Autowired
	public void setBookRepo(BookRepo repo) {
		this.repo = repo;
	}
	public BookRepo getBookRepo() {
		return repo;
	}
	@Override
	public int insert(Book book) {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public int update(Book book) {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public int delete(String isbn) {
		// TODO Auto-generated method stub
		return 0;
	}
	@Override
	public Book select(String isbn) {
		// TODO Auto-generated method stub
		return null;
	}
	@Override
	public List<Book> search() {
		// TODO Auto-generated method stub
		return null;
	}
}

UserService.java

package com.ssafy.ws.model.service;

import com.ssafy.ws.dto.User;

public interface UserService {
	User select(String id);
}

UserServiceImpl.java

package com.ssafy.ws.model.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.ssafy.ws.dto.User;
import com.ssafy.ws.model.repo.UserRepo;

/**
 * 빈으로 등록될 수 있도록 @Service를 선언한다.
 *
 */
@Service
public class UserServiceImpl implements UserService {
	/**
	 * has a 관계로 사용할 UserRepo 타입의 repo를 선언한다.
	 */
	private UserRepo repo;
	
	/**
	 * 생성자를 통해 UserRepo를 주입받는다.
	 * UserRepo 타입의 빈을 주입받기 위해 @Autowired를 사용한다.
	 * @param repo
	 */
	@Autowired
	public UserServiceImpl(UserRepo repo) {
		this.repo = repo;
	}
	@Override
	public User select(String id) {
		// TODO Auto-generated method stub
		return null;
	}
}

 

설정파일

application.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"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
	<!-- com.ssafy.ws.model 패키지를 스캔해서 빈을 등록한다. -->


	<context:component-scan base-package="com.ssafy.ws.model" />


	<bean id="ds" class="org.apache.commons.dbcp2.BasicDataSource">
		<property name="driverClassName" value="~~~~"></property>
		<property name="url" value="~~~~"></property>
		<property name="username" value="~~~~"></property>
		<property name="password" value="~~~~"></property>
	</bean>



</beans>

log4j.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">

	<!-- Appenders -->
	<appender name="console" class="org.apache.log4j.ConsoleAppender">
		<param name="Target" value="System.out" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern" value="%-5p: %c - %m%n" />
		</layout>
	</appender>
	
	<!-- Application Loggers -->
	<logger name="com.ssafy.ws">
		<level value="debug" />
	</logger>
	
	<!-- 3rdparty Loggers -->
	<logger name="org.springframework.core">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.beans">
		<level value="info" />
	</logger>
	
	<logger name="org.springframework.context">
		<level value="info" />
	</logger>

	<logger name="org.springframework.web">
		<level value="info" />
	</logger>

	<!-- Root Logger -->
	<root>
		<priority value="warn" />
		<appender-ref ref="console" />
	</root>
	
</log4j:configuration>
728x90

'WEB > Spring' 카테고리의 다른 글

[Spring] Spring FileUpload + 예제 실습  (0) 2022.04.24
[Spring] Spring Interceptor /Filter + 예제 실습  (0) 2022.04.24
[Spring] Spring AOP + 예제 실습  (0) 2022.04.24
[Spring] Spring MVC + 예제 실습  (0) 2022.04.23
[Spring] Spring이란  (0) 2022.04.16

댓글