일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 코드로 배우는 스프링 웹 프로젝트
- Tomcat version 8.5 only supports J2EE 1.2
- WAS와 WEB서버 차이
- 정보처리기사 1과목
- HTTP와 HTTPS의 차이
- and Java EE 5
- and 7 Web modules
- 테스트코드 작성
- @RequiredArgsConstructor
- 인터페이스와 추상클래스 차이
- 쿠키와 세션의 차이
- 정보처리기사 해설
- 의존성 주입
- 스프링 게시판 만들기
- HTTP
- java 면접질문
- pom.xml 설정
- oracle Database 설정
- 정보처리기사 20년
- 공개 암호화키
- org.mybatis.spring.MyBatisSystemException
- 톰캣에러
- 쿠키와 세션의 특징
- Junit Test 에러
- java jdk 오류
- @RediretAttribute
- 게시판 만들기
- 코드로 배우는 스프링부트 웹 프로젝트
- 코드로 배우는 스프링 웹프로젝트
- 정보처리기사
- Today
- Total
모아이티
[게시판 만들기] 코드로 배우는 스프링 웹 프로젝트 Part 1 - 의존성 주입 본문
의존성이란?
-> 하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다는 것 즉 A라는 객체는 B 객체 없이는 동작하지 않을 때
'A가 B에 의존적이다'라고 표현합니다.
주입이란?
-> 음식점으로 예를 들어보자면 식당에서 식재료가 필요하면 식당 주인이
A. 직접 장을 보러 가는 경우
B. 본사에서 식재료를 구입하는 경우
가 있는데 이처럼 수동적인지 능동적인지에 대한 문제를 다룹니다.
그래서 의존성 주입이란?
-> '어떤 객체가 필요한 객체를 외부에서 밀어 넣는다'
이 방식을 왜 사용할까?
-> 본사에서 음식을 배달해주면 주인 입장에서 편리합니다. 주인은 요리만 하면 된다는 장점이 있습니다.
이와 마찬가지로 코드로 설명하면
'주입을 받는 입장에서 어떤 객체인지 신경 쓸 필요가 없다',
'어떤 객체에 의존하든 자신의 역할은 변하지 않는다'
= 내가 필요한 객체를 요청만 하면 외부에서 알아서 객체를 생성해준다.
"스프링은 이런 트랜잭션의 관리를 어노테이션이나 XML로 설정할 수 있기 때문에 개발자가 매번 상황에 맞는 코드를 작성할 필요가 없도록 설계되었습니다."
아래에서는 의존성 주입 테스트 실습을 진행하겠습니다.
실습
1. sample 패키지 생성, Chef 클래스 생성
root-context.xml - namespaces - context에 체크 후 저장
<context:component-scan base-package="org.zerock.sample"></context:component-scan>
org.zerock.sample 패키지를 추가
Chef 클래스로 돌아가서 @Data 어노테이션을 추가하면 Chef 클래스에 toString, equals, hashCode가 생성된다.
2. Restaurant 클래스 생성
@Autowird로 Chef 클래스를 의존성 주입을 시켜준다.
3. 테스트 코드
pom.xml에서 junit을 찾은 후 4.12로 변경시킨다.
<!-- Test 코드 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version> <!-- 4.12로 변경 -->
<scope>test</scope>
</dependency>
log4j에서 exclusions 부분 삭제
log4j 버전 1.2.17로 변경
3. Test 코드 작성
src/test/resources - org.zerock.sample패키지 생성 - SampleTests 클래스 생성
<!-- spring-test 추가 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${org.springframework-version}</version>
</dependency>
pom.xml에 spring-test dependency 추가
SampleTest.java에 Test어노테이션 추가
package org.zerock.sample;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class SampleTests {
@Autowired
private Restaurant restaurant;
@Test
public void test1() {
System.out.println("test1////////////////////");
log.info("test1/////////////////");
log.info(restaurant);
}
}
test 코드 결과가 나오고 주입받은 restaurant 객체도 알맞게 결과가 나온다.
의존성 주입 추가 설명
SampleHotel 클래스 생성
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.ToString;
//필드 주입
//setter 주입
//생성자 주입
@Component
@ToString
public class SampleHotel {
private Chef chef;
//생성자
public SampleHotel(Chef chef) {
super();
this.chef = chef;
}
}
SampleTests.java
package org.zerock.sample;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import lombok.extern.log4j.Log4j;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("file:src/main/webapp/WEB-INF/spring/root-context.xml")
@Log4j
public class SampleTests {
@Autowired
private Restaurant restaurant;
@Autowired
private SampleHotel hotel;
@Test
public void testHotel() {
log.info(hotel);
}
@Test
public void test1() {
System.out.println("test1////////////////////");
log.info("test1/////////////////");
log.info(restaurant);
}
}
SampleHotel을 주입받고 log를 찍어본다.
package org.zerock.sample;
import org.springframework.stereotype.Component;
import lombok.RequiredArgsConstructor;
import lombok.ToString;
//필드 주입
//setter 주입
//생성자 주입
@Component
@ToString
@RequiredArgsConstructor
public class SampleHotel {
private final Chef chef;
}
요즘에는 @RequiredArgsConstructor 이 방법이 많이 쓰인다고 한다. 그리고 주입받을 변수에 final을 꼭 붙이기!
@RequiredArgsConstructor 이 어노테이션은 초기화 되지않은 final 필드나, @NonNull 이 붙은 필드에 대해 생성자를 생성해 준다. 주로 의존성 주입(Dependency Injection) 편의성을 위해서 사용되곤 한다.
출처
- 코드로 배우는 스프링 웹 프로젝트(책)
- Youtube 구멍가게 코딩단
'Spring 게시판 만들기' 카테고리의 다른 글
[게시판 만들기] 코드로 배우는 스프링 웹 프로젝트 Part2 - 스프링MVC (0) | 2021.03.05 |
---|---|
[게시판 만들기] 코드로 배우는 스프링 웹 프로젝트 Part1 - Mybatis 연동 (0) | 2021.03.02 |
[게시판 만들기] 코드로 배우는 스프링 웹 프로젝트 Part1 - JDBC 연결 & Hikari CP 커넥션 풀 설정 (0) | 2021.03.02 |
[게시판 만들기] 코드로 배우는 스프링 웹 프로젝트 - Part1 Oracle Database 연동 (0) | 2021.03.02 |
[게시판 만들기]코드로 배우는 스프링 웹 프로젝트 - Part1 개발환경설정 (0) | 2021.03.02 |