Spring Boot
- 미리 설정된 Spring 기반 프로젝트 템플릿
- Spring 및 각종 연동 기술의 표준화된 버전 제공
- 설정 최소화
Spring IOC (Inversion Of Control)
- 제어의 역전이라는 뜻
- Bean정의로 의존성을 생성자나 프로퍼티를 통해 정의
- 컨테이너는 실행시 인젝션 지원
- 애플리케이션 로직으로부터 객체 생성을 분리시켜 객체간의 의존성을 외부에 정의하고 컨테이너로부터 객체를 공급받음
Spring Container
- IoC 및 POJO( Plain Old Java Object ) 기반 개발을 지원
- POJO 기반으로 설계/개발된 모듈을 모아서 애플리케이션
Bean
- Spring Framework 에서 애플리케이션 핵심
- Spring IoC Container는 메타 데이터 정보에 설정된 의존 관계를 이용해 객체를 관리
Spring IoC Container
- ApplicationContext는 애플리케이션 객체를 관리하는 역할, 애플리케이션이 생성한 모든 빈을 보유하고 관리하는 Spring IoC Container을 말함
- BeanFactory는 Spring컨테이너에 접근하기 위한 루트 인터페이스로, Bean을 관리하기 위한 기능 제공
- ApplicationContext는 BeanFactory의 하위 인터페이스로 BeanFactory의 모든 기능을 제공하며 엔터프라이즈 특화 기능을 추가 제공
- ApplicationContext는 BeanFactory 기능 이외에 다양한 리소스 로딩 방법, Early Binding(Context 시작 시 Bean을 미리 로딩)으로 초기에 환경 오류를 발견
- 컨테이너를 생성하고 XML을 메타데이터로 사용하여 빈을 로드하는 방법
String path = "Documents/demoProject/src/main/resources/applicationcontext/student-bean-config.xml";
ApplicationContext context = new FileSystemXmlApplicationContext(path);
AccountService accountService = context.getBean("studentService", StudentService.class);
Dependency
- 애플리케이션 내부의 Bean 사이의 의존관계를 핸들링 하는 방법
- 각 Bean 간의 느슨한 결합이 될 수 있도록 DI (의존성 주입)을 지원함
- DL (Dependency Lookup)으로 필요한 객체를 Container로부터 지원 받음
DL (Dependency Lookup)
DL (Dependency Lookup)
객체가 필요한 의존성을 직접 찾는 방식으로 Spring에서는 Bean을 조회하는 형태로 구성
Dependency 예제
1. 객체 자체적으로 의존성을 검색하고 필요한 빈을 가져오는 방식
ApplicationContext applicationContext = new ClassPathXmlApplicationContext("/application-context.xml");
MyBean bean = applicationContext.getBean("myBean");
2. Lookup 어노테이션을 사용해 메소드 수준에서 의존성 주입을 지원
Spring이 메소드를 호출할 때 해당 메소드의 반환 타입의 인스턴스를 반환하도록 지시하여 프로토타입 범위의 빈을 싱글톤 빈에 주입하는 등 경우에 유용
@Service
public abstract class MySingletonService {
@Lookup
public abstract MyPrototypeBean getMyPrototypeBean();
public void doSomething() {
MyPrototypeBean prototypeBean = getMyPrototypeBean();
// prototypeBean을 사용하여 로직 수행
}
}
3. Autowired 어노테이션을 사용해 의존성 주입을 자동으로 처리하는 방식
Spring이 적절한 빈을 자동으로 주입
@Service
public class MyService {
private final MyRepository myRepository;
@Autowired
public MyService(MyRepository myRepository) {
this.myRepository = myRepository;
}
public void doSomething() {
// myRepository를 사용하여 로직 수행
}
}
Annotation
- Spring XML만을 사용하면, XML 파일의 설정이 지나치게 복잡하나 Annotation 을 사용하면 Spring XML 파일의 설정 없이도 Bean을 사용할 수 있게 됨
- Spring 컨테이너에 의해 관리되어야 할 Bean 정의 시 사용
- Spring 컨테이너는 클래스 패스를 검색하여 정의된 클래스를 Bean으로 인식함
- Name을 정의하지 않으면 Bean Name은 클래스 명의 Camel Casing(첫글자 소문자)로 생성
@Repository("TestDAO")
public class TestDAOImpl extends SqlMapClientDaoSupport implements TestDAO {
...
}
TestDAO testDao = (TestDAO) context.getBean("TestDAO");
// name을 정의하지 않은 경우 Bean Name은 클래스 명의 첫 글자 소문자로 생성
TestDAO testDao = (TestDAO) context.getBean("testDaoImpl");
...
@Component
일반적인 컴포넌트로 인식하며 다른 Annotation의 부모형
@Service
비즈니스 서비스를 의미
@Repository
데이터 엑세스 계층에서 사용하며 데이터 관련 예외, 트랜잭션 자동 지원
@Controller
프레젠테이션 계층의 웹용 MVC 컴포넌트, Spring MVC 구성 시 사용
@Autowired
타입을 이용하여 의존 관계를 자동으로 설정해 줌
생성자, 필드, 메소드에 적용
값을 반드시 사용하지 않으면 (required=false)로 지정
@Service("TestService")
public class TestServiceImpl implements TestService {
@Autowired(required=false)
private TestDao testDao;
....
}
@Resource
애플리케이션에서 필요로 하는 자원을 자동 연결할 때 사용
@Controller
public class TestController {
//Autowired와 유사하며 name 속성에 필요로 하는 Bean 이름을 입력
@Resource(name="jsonTemplete")
private View jsonView;
....
}
Spring MVC
- MVC (Model, View, Controller) 패턴 기반의 웹 프레임워크
- Controller, Handler Mapping, ModelAndView, View Resolver, View 등으로 구성
- 모든 요청을 받아 처리할 Controller에게 전달하는 Front Controller로 DispatchServlet 사용
- @Controller와 @RequestMapping 만으로도 컨트롤러 구현 가능
- @PathVariable, @RequestBody, @ResponseBody 등 Annotation 및 여러 가지 새로운 특징을 기반으로 Restful 웹 서비스 구축 가능
DispatchServlet
모든 요청을 중앙에서 처리하는 중앙 컨트롤러 역할을 하며 실제 작업은 위임 컴포넌트에서 수행된다.
HttpServlet에서 상속받아 구현되며 일반적으로 web.xml 파일에서 구성된다.
웹 애플리케이션에서 여러 인스턴스를 정의할 수 있으며 각 인스턴스는 자체 네임스페이스에서 작동, 자체 애플리케이션 컨텍스트를 로드한다.
루트 애플리케이션 컨텍스트는 ContextLoadListener 에 의해 로드되며 공유된다.
애플리케이션은 단일 DispatcherServlet을 가진다.
컨텍스트 루트 URL(/)에 매핑되어, 해당 도메인으로 들어오는 모든 요청을 처리한다.
HttpServlet
Java Servlet API 일부로 HTTP 프로토콜을 사용하는 웹 애플리케이션에 적합한 Servlet을 생성하기 위한 추상 클래스를 제공
* Java Servlet API
Java 프로그래밍 언어를 사용하여 웹 애플리케이션을 개발할 때 사용되는 표준 라이브러리
웹 서버와 servlet 간 통신을 정의하고, servlet의 생명주기를 관리하며, servlet context에 접근을 제공하는 등 기능을 제공
* Servlet
Java 프로그래밍 언어로 작성된 작은 프로그램으로 웹 서버 내에서 실행.
웹 클라이언트로부터 요청을 받아 처리하고 일반적으로 HTTP (HyperText Transfer Protocol)을 통해 응답함.
네임스페이스
컴퓨터 시스템 내에서 이름 중복을 방지하기 위해 사용되는 범위
애플리케이션 컨텍스트
Spring IoC Container의 구현체로 Bean의 생명주기와 Bean 간 의존성을 관리
Spring MVC 처리 프로세스
DispatcherServlet
Request 정보를 Controller에게 전달하고 처리된 결과를 받아 View에게 전달하는 일종의 Servlet이기에 web.xml에 등록해야 한다.
HandlerMapping
Request Url 각각을 어떤 Controller 가 처리할 것인지 결정한다.
@RequestMapping 정보를 참조한다.
Controller
Request를 직접 처리한 후 그 결과를 다시 DispatcherServlet에 전달한다.
결과 값은 ModelAndView를 이용하며 결과와 View의 논리적인 이름을 갖고 있다.
ViewResolver
View의 정보를 가지고 있으며 View의 논리적인 이름을 받으면 View의 리소스를 찾아내는 역할을 한다.
View
Controller가 처리할 결과를 담을 View를 생성한다.
SqlSession
SqlSession은 SqlSessionFactory 클래스에서 인스턴스화 된다.
데이터 소스 정의, 트랜잭션 관리자 세부 정보, 엔티티 간 관계를 정의하는 Mapper 목록을 포함하는 설정을 사용해 인스턴스화 된다.
Config
데이터베이스 연결, 트랜잭션 관리, 매퍼 매핑 정보를 설정한다.
Config에서 위 작업을 마치면 SqlSession이 이 설정을 기반으로 Map을 호출한다.
Map
Model에 속성을 추가하거나 병합하는 데 사용되는 개념이다.
Model은 View를 렌더링하는 데 사용되는 데이터를 제공하며, 이 데이터는 Key-Value 형태로 저장된다.
이러한 Key-Value 형태는 일반적으로 Map 인터페이스를 구현한 클래스의 인스턴스로 표현된다.
Controller 클래스
Annotation 기반으로 개발된 Controller 클래스는 POJO로 작성하며 선언부에 @Controller만 명시하면 된다.
// @Controller = 컨트롤러 클래스 정의
@Controller
public class ModelController {
}
POJO (Plain Old Java Object)
특정 기술이나 프레임워크에 종속되지 않는 코드를 작성.
객체 지향적인 원리에 충실하며 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트.
애플리케이션의 핵심 로직과 기능을 담아 설계하고 개발하는 방법을 POJO 프로그래밍이라고 부른다.
Url 매핑 기능
@Controller
// @RequestMapping = HTTP Request URL을 처리할 컨트롤 클래스 또는 메서드 정의
@RequestMapping("\getUserList.do")
public class GetUserListController {
// @RequestMapping 대신 이렇게 쓸 수 있음 @GetMapping / @PostMapping / @PutMapping / @DeleteMapping
@RequestMapping
public String getUserList(HttpServletRequest request, SearchVo searchVo) throws Exception {
...
}
}
Request Method 지정
@Controller
@RequestMapping("/addUserList.do")
public class GetUserListController {
@RequestMapping(method=RequestMethod.GET)
public String addUserView() {
...
}
@RequestMapping(method=RequestMethod.POST)
public String getUserList(HttpServletRequest request, @ModelAttribute("item"), UserVO userVo, BindingResult result) throws Exception {
...
}
// value 속성 = url 경로 지정
// method 속성 = Http Request Method를 지정하기 위해 사용
// params 속성 = 요청 시 전달되는 파라미터의 조건을 명시하기 위해 사용
@RequestMapping(value="/test.do", method=RequestMethod.GET)
....
}
// ------------------------------------------------------
@Controller
@RequestMapping("/User")
public class UserController {
@PostMapping("/add")
public String addUser(UserVO userVo) {
....
}
@PostMapping("/delete")
public String deleteUser(UserVO userVo) {
....
}
@GetMapping("/list")
public String getUserList(UserVO userVo) {
....
}
}
메서드 파라미터 타입
// Request, Response
// = Servlet에서 제공되는 HttpServletRequest, HttpServletResponse 객체를 파라미터로 지정할 수 있음
@RequestMapping("/request.do")
public String request(HttpServletRequset request, HttpServletResponse response) {
...
}
// Session
// = HttpSession 객체를 파라미터로 지정할 수 있음
@RequestMapping("/session.do")
public String session(HttpSession session) {
...
}
// @RequestParam
// = HTTP Request 포함된 파라미터 참조 시 사용, 값을 필수로 받아야 실행됨
// = ServletRequest에서 제공하는 getParameter(String paramName) 메소드로 전달받을 수 있는 값을 지정할 수 있음
@RequestMapping("/param.do")
public String requestParam(@RequestParam("id") String id) {
...
}
// 위는 값이 안들어오면 실행되지 않음.
// 아래는 값이 없어도 기본 값을 지정하여 실행할 수 있게 만듬
@RequestMapping("/param1.do")
public String requestParam(@RequestParam("id", required=false, defaultValue="1") String id) {
...
}
// Command 객체
// = 임의의 Command 객체를 선언하여 사용할 수 있음
@RequestMapping("/login.do")
public String login(UserVO userVo) {
...
}
HttpServletRequest
클라이언트로부터 서버에 전송되는 HTTP 요청을 처리하는 데 사용한다.
요청 메소드(GET, POST 등), 요청 URI, 헤더 정보, 파리미터, 쿠키, 세션 데이터 등을 얻을 수 있다.
HttpServletResponse
서버가 클라이언트에게 전송하는 HTTP 응답을 처리라는 데 사용한다.
응답 상태 코드, 헤더 정보, 응답 본문 등을 설정할 수 있다.
응답 본문에 데이터를 쓰는 메소드도 제공된다.
'개발 > Spring' 카테고리의 다른 글
Spring 2장 - MyBatis Framework (0) | 2024.05.02 |
---|---|
Spring 3장 - RESTful Service (0) | 2024.04.23 |