일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- Oracle
- DB
- 자바
- Oracle SQL Developer
- 빅오표기법
- java
- 접근제한자
- DB 제약조건
- DATABASE
- Vo
- DTO
- DAO
- oracle developer
- 오라클
- oracle db
- O(n)
- mvc디자인패턴
- 데이터베이스
- C#접근제한자
- java접근제어자
- JSP
- o(log n)
- break
- DEFAULT
- C언어 표준 라이브러리
- 자바연산자
- JavaSwing
- C#접근제어자
- sql
- 메이븐업데이트
Archives
성장일기 : 문과생의 개발 여정 (งᐖ)ว ( ᐛ )و
의존성 주입 본문
의존성
- 하나의 클래스를 실행하기 위해 필요한 다른 클래스
- 자바에서는 의존 관계를 구현하기 위해 생성자를 사용한다
- 생성자를 사용하는 경우 유지보수 비용이 많이 발생한다
의존성 주입
- 선언만 해놓으면 알아서 해당 클래스의 인스턴스를 채워주는 방식
- 의존성을 외부에서 주입하여 객체간의 결합도를 낮출 수 있다
- 스프링에서 의존성 주입을 활용하기 위해서는 반드시 기본 생성자가 구현되어 있어야한다
Java Bean Object 자바빈 객체
- 데이터 클래스를 만들 때 계속해서 사용하던 방식
- 필드값(속성)의 접근제어자는 private 이어야한다
- 각 필드에 대한 접근은 Getter / Setter 를 활용해야한다
- 기본 생성자가 반드시 존재해야 한다
- 자바빈 스타일 객체는 자바 생태계에 속한 다양한 프레임워크, API들의 표준임으로 반드시 지키는 것이 좋다
스프링의 의존성 주입
- 컨텍스트에 객체를 등록해 놓는다 (root-context)
- 스프링이 컨텍스트에 등록된 객체로 인스턴스를 미리 만들어 놓는다 (싱글톤 활용)
- 만들어진 인스턴스가 필요한(대입할) 변수가 있다면 해당 인스턴스를 제공한다 (즉 컨텍스트에 등록된 객체를 스프링이 적재적소에 분배)
의존성 주입을 위한 어노테이션들
@Component : 컨텍스트에 컴포넌트 스캔을 통해 수거해갈 수 있는 대상이 된다
@Controller : MVC 패턴에서 컨트롤러 역할을 수행하는 컴포넌트 들을 표시한 어노테이션
@Repository : MVC 패턴에서 모델 역할을 하는 컴포넌트들을 표시한 어노테이션
@Service : MVC 패턴에서 비지니스 로직 역할을 수행하는 컴포넌트들을 표시한 어노테이션
@Autowired : 컨텍스트에 등록된 컴포넌트 중에 알맞은 것을 요청하는 어노테이션
- 생성자를 사용하지 않고 스프링이 대신 인스턴스를 생성하여 주입하기 때문에 클래스 간의 결합도가 낮아져 유지보수가 용의해진다
컨텍스트에 빈(Bean) 직접 등록하기
- context:component-scan 을 통해 컴포넌트들을 컨텍스트에 등록할 수 있다
- <beans: bean>으로 스캔을 통하지 않고 클래스를 컨텍스트에 직접 등록할 수도 있다.
두 내용 모두 servlet-context 통해서 확인가능 - 스캔을 통하지 않고 클래스를 컨텍스트에 등록할 수 있다
- 컨텍스트에 등록된 자바 객체를 빈이라고 부른다
- 컨텍스트에 등록한 자바 객체들을 싱글톤 디자인 패턴을 사용해 등록된다
싱글톤 (Singleton)
- 어플리케이션 내에서 단 하나의 인스턴스만 가지고 있다는 것을 보장해주는 디자인 패턴
HomeController.java
package com.ezen.springmvc;
import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import com.ezen.springmvc.model.Cook;
@Controller
public class HomeController {
private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
@Autowired //생성자를 사용하지 않아도 스프링에서 수거해간 후 그 클래스 바탕으로 인스턴스 만들어서 대입해준것
Cook cook; // = new Cook();
@RequestMapping(value = "/", method = RequestMethod.GET)
public String home(Locale locale, Model model) {
logger.info("Welcome home! The client locale is {}.", locale);
Date date = new Date();
DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
String formattedDate = dateFormat.format(date);
model.addAttribute("serverTime", formattedDate );
model.addAttribute("cook", cook);
System.out.println(cook);
return "home";
}
}
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page session="false"%>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>Hello world!</h1>
<p>The time on the server is ${serverTime}.</p>
<p>${cook}</p>
</body>
</html>
Cook.java
package com.ezen.springmvc.model;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
//@Component
// 어노테이션이 사용되어 이 클래스를 Spring 빈으로 선언, Spring이 해당 클래스의 인스턴스를 관리하도록 지시하는 것
// 컴포넌트 추가해야 JSP에서 수거해서 생성자를 만들어준다 (?)
public class Cook {
@Autowired
Dish dish; //= new Dish();
@Autowired
Food food; //= new Food();
private Cook() {} // 접근제어하면서 막아도 동작쓰한다.
@Override
public String toString() {
return String.format("%s/%s", food, dish);
}
}
// web.xml에 모든것을 등록해놓고 필요할때 찾아 사용한다
Dish.java
package com.ezen.springmvc.model;
import org.springframework.stereotype.Repository;
@Repository
//@Component
public class Dish {
}
Food.java
package com.ezen.springmvc.model;
/*@Component*/
public class Food {
}
Food2.java
package com.ezen.springmvc.model;
import org.springframework.stereotype.Repository;
@Repository
//@Component
public class Food2 extends Food{
}
'백엔드개발 > Spring' 카테고리의 다른 글
MVC 디자인 패턴, 모델 속 요소들 (0) | 2024.05.22 |
---|---|
SPRING Framework (0) | 2024.03.23 |
메이븐 (Maven) (1) | 2024.03.14 |
스프링 프레임워크 (1) | 2024.03.14 |
Spring - 설치 및 세팅 (1) | 2024.03.14 |