Spring
- JAVA의 웹 프레임워크로 JAVA 언어를 기반으로 사용한다. JAVA로 다양한 어플리케이션을 만들기 위한 프로그래밍 틀이라 할 수 있다.
- 옛날에 비교하면 지금은 JAVA의 활용도가 높아졌고 따라서 프로젝트 규모도 커졌다. JAVA를 이용한 기술은 JSP, MyBatis, JPA 등 여러가지가 있는데 즉, 이 기술들이 프로젝트에 많이 쓰인다고 할 수 있다. Spring은 이 기술들을 더 편하게 사용하기 위해 만들어진 것이다.
- 프로젝트를 진행하다 보면 아무리 분업을 해도 분명 중복되는 코드가 있기 마련이다. Spring은 이런 중복코드의 사용률을 줄여주고, 비즈니스 로직을 더 간단하게 해줄 수 있다.
- Spring을 사용하면 다른 사람의 코드를 참조하여 쓰기 편리한데 이말의 의미는 오픈소스를 좀더 효율적으로 가져다 쓰기 좋은 구조라는 것이다.
- 결론적으로 Spring이란 JAVA 기술들을 더 쉽게 사용할 수 있게 해주는 오픈소스 프레임 워크이다.
- 이런 Spring을 더 쉽게 해주는 프레임워크는 Spring Boot다. 하지만 현재 개발시장에 있는 코드들이 모두 Spring Boot로 되어있지는 않은게 현실. 새로운것을 개발하는거보다 기존의 시스템을 유지보수 해야될때도 있기때문에 spring, spring boot 모두 잡고 가야 하는게 핵심이다.
Coffee에 대한 객체를 만들어 본다고 생각하면
아메리카노, 라떼 등 다양한 커피의 종류가 있는데 이를 관리하기 위해서 하나하나의 클래스를 지정하고 그에 따른 메소드를 관리한다고 생각해보자.
1. Americano cof = new Americano() 이런식으로 각 종류의 커피에 대한 모든 구현을 할 수 있지만 비효율적
2. Coffee cof = new Americano(), interface를 써서 메소드를 미리 구현해놓고 사용하기
-> 1번 보단 효율적이지만 만약 이러한 프로그램을 상용적으로 판다고 생각해보면 객체를 new 한다는 것 자체는 프로그램내에서 되게 부담스러운 일이다.
Spring 용어 정리
Container
- Spring은 자바 객체를 담고 있는 컨테이너
- Spring Container는 이들 자바 객체의 생성과 소멸과 같은 Life-cycle을 관리
Bean
- spring이 IoC 방식으로 관리하는 Object
- spring이 직접 그 생성과 제어를 담당하는 Object만을 Bean이라고 부른다
- Spring Bean은 기본적으로 Singleton으로 만들어짐
- 따라서, Container가 제공하는 모든 Bean의 인스턴스는 항상 동일
Bean Factory
- spring이 IoC를 담당하는 핵심 컨테이너
- Bean을 등록, 생성, 조회, 반환하는 기능을 담당
- 일반적으로 BeanFactory를 바로 사용하지 않고 이를 확장한 ApplicationContext를 이용
ApplicationContext
- BeanFactory를 확장한 IoC 컨테이너
- Bean을 등록하고 관리하는 기본적인 기능은 BeanFactory와 동일
- BeanFactory라고 부를 때는 주로 Bean의 생성과 제어의 관점
- ApplicationContext라고 할 때는 spring이 제공하는 애플리케이션 지원 기능을 모두 포함
** Lombok
dto에서 setter, getter, constructor를 자동적으로 생성해줘서 유지보수가 매우 편리한 도구
ex) 변수명 하나를 바꾼다면 setter, getter, constructor의 이름 모두 바꿔야하는데 자동적으로 바꿔줌
IoC/DI (Inversion of Control, 제어의 역행)
- 객체지향 언어에서 Object간의 연결 관계를 런타임에 결정
- IoC의 구현 방법 중 하나가 DI(Dependency Injection) 인데 spring은 DI 사용
- DL : container가 lookup context를 통해서 필요한 Resource나 object를 얻는방식
- DI : object에 lookup 코드를 사용하지 않고 container가 직접 의존 구조를 object에 설정 할 수 있도록 지정해주는 방식
DI(Dependency Injection - 의존성 지원) 패턴
- Container가 직접 의존 구조를 Object에 설정 할 수 있도록 지정
- Spring은 설정 파일이나, annotation을 통해서 객체 간의 의존 관계를 설정 가능
- 따라서, 객체는 의존하고 있는 객체를 직접 생성하거나 검색할 필요가 없다.
Annotation 방식을 사용할 때 객체 스캔하는 방법
<context:componet-scan base-package="com.test.hello.*/">
@RequestMapping
요청을 Mapping 할 때 이름이나 method Type 지정해주는 annotation
@GetMapping, @PostMapping
get, post에 맞춰서 Mapping
@Controller
@RequestMapping("/user")
public class UserController {
UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
//@RequestMapping(value="/list", method=RequestMethod.GET)
@GetMapping("/userRegist")
public String userRegist(){
// TODO Auto-generated method stub
return "user_regist";
}
@PostMapping("/save")
public String save(Book book, Model model ){
//data validcheck ->business method call->scope data save -> view select
// Book book = null;
try {
// book = new Book();
// book.setIsbn(request.getParameter("isbn"));
// book.setTitlte(request.getParameter("title"));
// book.setAuthor(request.getParameter("author"));
// book.setPrice(Integer.parseInt(request.getParameter("price")));
// book.setDesc(request.getParameter("desc"));
bookService.insert(book);
model.addAttribute("book", book);
} catch (SQLException integrityError) {
model.addAttribute("message","도서 등록 실패:"+book.getIsbn()+"은 이미 사용중입니다.");
return "regist";
} catch(Exception inputError) {
inputError.printStackTrace();
return "error/500";
}
return "redirect:/main/list";
}
...
...
...
AOP(Aspect Oriented Programming)
우리가 메소드의 성능을 검사하거나 트랜잭션 처리(무수히 많은 try-catch), 예외반환 등 핵심관심사항 & 공통관심사항을 쉽게 보기 위해 나온 것
Spring MVC
Spring 프로그램 흐름 읽기
Interceptor
'Backend > Spring' 카테고리의 다른 글
[Spring] Spring MVC 패턴 적용 (0) | 2022.10.21 |
---|---|
[Spring] Spring UTF8 한글 설정 (0) | 2022.10.21 |
[Spring] Interceptor에 대해 (0) | 2022.10.21 |
[Spring] FileUpload, FileDownload에 대해 (0) | 2022.10.21 |
[Spring] AOP에 대해 (0) | 2022.10.21 |