하루에 4개씩 기초 지식! [백엔드 Spring Ver.]
1. WAS(Web Application Server)와 WS(Web Server)의 차이?
- WAS(Web Application Server)
- 비즈니스 로직을 넣을 수 있음
- Tomcat, PHP, ASP, NET 등
- WS(Web Server)
- 비즈니스 로직을 넣을 수 없음
- Nginx, Apache 등
2. Spring Framework란 뭐죠?
- 스프링 프레임워크는 자바 개발을 편리하게 해주는 오픈소스 프레임워크 입니다.
- 경량 컨테이너로서 자바 객체를 직접 관리
- 각각의 객체 생성, 소멸과 같은 라이프 사이클을 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.
- 제어의 역전(IoC)이라는 기술을 통해 어플리케이션의 느슨한 결합을 도모
- 컨트롤 제어권이 사용자가 아닌 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출.
- 컨트롤 제어권이 사용자가 아닌 프레임워크에 있어서 필요에 따라 스프링에서 사용자의 코드를 호출.
- 의존성 주입(DI, Dependency Injection)을 지원
- 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
- 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜준다.
- 관점 지향 프로그래밍(AOP, Aspect-Oriented Programming)을 지원
- 트랜잭션이나 로깅, 보안과 같이 여러 모듈에서 공통적으로 사용하는 기능의 경우 해당 기능을 분리하여 관리.
- 경량 컨테이너로서 자바 객체를 직접 관리
3. @RequestBody, @RequestParam, @ModelAttribute의 차이는?
- @RequestBody
- 클라이언트가 전송하는 JSON의 형태의 HTTP body 내용을 MessageConverter를 통해 Java Object로 변환해주는 역할
- 클라이언트가 전송하는 JSON의 형태의 HTTP body 내용을 MessageConverter를 통해 Java Object로 변환해주는 역할
- @RequestParam
- 1개의 HTTP 요청 파라미터를 받기 위해 사용한다. @RequestParam은 필수 여부가 true이기 때문에, 기본적으로 반드시 해당 파라미터가 전송되어야 한다. 전송되지 않으면 404 Error를 유발할 수 있으며, 반드시 필요한 변수가 아니라면 required의 값을 false로 설정해줘야 한다.
- 1개의 HTTP 요청 파라미터를 받기 위해 사용한다. @RequestParam은 필수 여부가 true이기 때문에, 기본적으로 반드시 해당 파라미터가 전송되어야 한다. 전송되지 않으면 404 Error를 유발할 수 있으며, 반드시 필요한 변수가 아니라면 required의 값을 false로 설정해줘야 한다.
- @ModelAttribute
- HTTP body 내용과 HTTP 파라미터(매개변수) 값들을 생성자, Getter. Setter를 통해 주입하기 위해 사용.
4. Spring MVC란??
- MVC는 Model, View, Controller의 약자이며, 각 레이어간 기능을 구분하는데 중점을 둔 디자인 패턴
- Model
- 데이터 관리 및 비즈니스 로직을 처리하는 부분(DTO, DAO, Service)
- DAO = 실제로 DB 데이터에 접근하는 객체 (CRUD)
- DTO = 계층 간 데이터 교환을 위한 객체(Java Bean)
- VO = 변경 불가능하며 오직 읽기만 가능
- 데이터 관리 및 비즈니스 로직을 처리하는 부분(DTO, DAO, Service)
- View
- 비즈니스 로직의 처리 결과를 통해 유저 인터페이스가 표현되는 구간(HTML, JSP, Thymleaf, Mustache)
- 비즈니스 로직의 처리 결과를 통해 유저 인터페이스가 표현되는 구간(HTML, JSP, Thymleaf, Mustache)
- Controller
- 사용자의 요청을 처리하고 Model과 View를 중개하는 역할
- Model과 View는 서로 연결 X Controller가 사이에서 통신 매체가 된다.
- 사용자의 요청을 처리하고 Model과 View를 중개하는 역할
- Model
- 4 -1 MVC 의 흐름
- DIspatcherServlet : 클라이언트에게 요청을 받아 응답까지의 MVC 처리과정을 통제 및 HandlerMapping
- HandlerMapping : 클라이언트의 요청 URL을 어떤 Controller가 처리할지 결정
- HandlerAdapter : HandlerMapping에서 결정된 핸들러 정보로 해당 메서드를 직접 호출해주는 역할
- ViewResolver : Controller의 처리 결과(데이터)를 생성할 View를 결정
- 클라이언트는 URL을 통해 요청을 전송
- Dispatcher Servlet은 HandlerMapping을 통해 해당 요청이 어느 컨트롤러에게 온 요청인지 찾는다.
- Controller에 요청 전달
- Controller는 비즈니스 로직을 처리 후 반환할 뷰의 이름을 반환
- Dispatcher Servlet은 View Resolver를 통해 반환할 View를 찾는다
- Dispatcher Servlet은 Controller에서 View에 전달할 데이터를 추가
- 데이터가 추가된 View를 반환.
의존성 주입..실패?!?!
과제로 주어진 프로젝트를 진행하다 마주친 에러,, 자세히 읽어보니 UnsatisfiedDependencyException,,,아ㅋ 이건 또 뭔데ㅋ
UnsatisfiedDependencyException이 에러는 @Autowried 어노테이션을 사용하였지만 그에 해당하는 Bean 을 찾지 못해서 발생하는 에러였다..!
천천히 코드를 오류코드를 보면서 어느 부분이 잘못된 건지 확인을 해보았다. 오류 코드의 전체는 다음과 같다.
org.springframework.beans.factory.UnsatisfiedDependencyException:
Error creating bean with name 'commentController' defined in file
[/Users/hsmac/Desktop/Spring/Todo/build/classes/java/main/com/todo/todo/controller/CommentController.class]:
Unsatisfied dependency expressed through constructor parameter 0:
Error creating bean with name 'commentService' defined in file
[/Users/hsmac/Desktop/Spring/Todo/build/classes/java/main/com/todo/todo/service/CommentService.class]:
Unsatisfied dependency expressed through constructor parameter 1:
Error creating bean with name 'todoRepository' defined in com.todo.todo.repository.TodoRepository defined in
@EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration:
Could not create query for public abstract
org.springframework.data.domain.Page com.todo.todo.repository.TodoRepository.findAll(java.awt.print.Pageable);
Reason: Paging query needs to have a Pageable parameter;
Offending method: public abstract org.springframework.data.domain.Page com.todo.todo.repository.TodoRepository.findAll(java.awt.print.Pageable)
오류가 났던 이유는 너어어어어어어어어무 어이가 없었다,, Paging query needs to have a Pageable parameter,, 페이징 쿼리를 실행하기 위해 Pagealble 타입의 파라미터를 기대한다는 뜻이였는데 맨 처음에는 뭐가 잘못된 건지 몰랐다.. .왜? 나는 Pageable 타입의 파라미터를 작성을 했으니...그래서 뭐가 문제인지 한참을 보았는데... 이럴수가,,,
내가 작성을 하려했던 것은 데이터베이스 조회 작업에서의 페이징을 구현하기 위해 Pageable을 사용하였던 것인데 정작 인쇄 작업에 필요한 'java.awt.print' 패키지의 Pageable 이었다........하하....
나는 'org.springframework.data.domain'의 Pageable을 사용했어야 했는데.... 조금 더 의심을 해봤어야 했다.. 알고봤더니..정말 기본적인 실수를 했다.. 얼른 framework의 Pageable로 수정을 했더니 결과는...?
해결..! 너무 기본적인 실수였어서 온 몸에 힘이 빠지는 느낌이 들었다...허허,,,좀 더 신중하게 봐야겠다..확실히 Spring을 학습을 진행하면서 프로젝트를 해보니 여러 어려움과 마주치면서 나아가고있지만 막히는 부분이 상당히 많았다..꾸역꾸역 나아가고 있지만..
정작 오류는 기본적인,,,흠흠,,,조금 더 신중하게 꼼꼼하게 완벽하게 하고싶어진다..!
'스프링' 카테고리의 다른 글
스프링 인증/인가..! JWt..? (0) | 2024.09.10 |
---|---|
Spring 인증 및 관리 시스템 (0) | 2024.09.06 |
Spring JPA 뭐하는 키워드지..? (1) | 2024.08.24 |
스프링 의존성 주입? 강한 결합? 느슨한 결합? (0) | 2024.08.21 |
Servlet은 뭐고 Dispatcher - Servlet은 뭐죠..? (0) | 2024.08.20 |