팀 프로젝트가 끝났다. 다음 프로젝트 시작전까지 약 2주라는 시간이 있다. 이 시간동안 강의와 밀린 문법 + 개인과제
할게 산더미다. 정말 열심히 이 시간을 잘써야 최종 프로젝트때 내가 배운 지식들을 잘 갈아 넣을 수 있을것이다.
3 Layer Architecture란?
1. Controller
- 클라이언트의 요청을 받는다
- 요청에 대한 로직 처리는 Service에게 전담
- Request 데이터가 있다면 Service에 같이 전달
- Service에서 처리 완료된 결과를 클라이언트에게 응답함
2. Service
- 사용자의 요구사항을 처리 ('비즈니스 로직') 하는 실세 중에 실세
- 따라서 현업에서는 서비스 코드가 계속 비대해지고 있다
- DB 저장 및 조회가 필요할 때는 Repository에게 요청
3. Repository
- DB 관리 (연결, 해제, 자원 관리) 합니다.
- DB CRUD 작업을 처리합니다.
정리
JPA의 주요 기능
- ORM (Object-Relational Mapping)
- JPA는 자바 객체와 데이터베이스 테이블 간의 매핑을 제공합니다. 이를 통해 개발자는 객체 지향적인 방식으로 데이터베이스를 사용할 수 있으며, 복잡한 SQL 쿼리 대신 자바 객체를 사용하여 데이터를 관리할 수 있습니다.
- 데이터베이스 독립성
- JPA는 특정 데이터베이스에 종속되지 않고 다양한 데이터베이스 시스템과 호환됩니다. 이를 통해 개발자는 데이터베이스 변경 시 최소한의 코드 수정으로도 대응할 수 있습니다.
- 표준화된 API
- JPA는 자바 EE 및 자바 SE 환경 모두에서 사용할 수 있는 표준화된 API를 제공합니다. 이는 다양한 JPA 구현체(예: Hibernate, EclipseLink, OpenJPA 등) 간의 일관된 프로그래밍 인터페이스를 의미합니다.
- 쉬운 CRUD 작업
- JPA는 엔티티 객체에 대한 생성(Create), 읽기(Read), 갱신(Update), 삭제(Delete) 작업을 쉽게 할 수 있도록 지원합니다. 이는 Entity Manager를 통해 수행되며, 복잡한 SQL 작성 없이도 데이터 작업을 수행할 수 있습니다.
Filter?
- 일반 적인 자바 웹 애플리케이션에서 클라이언트(사용자의 요청)는 HTTP나 HTTPS 프로토콜을 사용해서 서버의 자원에 접근하고 클라이언트(사용자) 요청은 서버의 서블릿에서 처리합니다.
- 서블릿은 HTTP 요청을 받아 처리한 후 HTTP 응답을 클라이언트에게 반환합니다.
- 일정을 등록하고 id 를 반환
- 일정을 조회해서 반환
- 스프링은 DispatcherServlet 이 서블릿 역할을 담당하고 모든 요청을 처리한다.
- 요청-응답 처리과정 중, 중요한 역할을 하는 주요 컴포넌트가 **필터**이다
- 아래의 그림과 같이 서블릿 앞에 위치해 요청과 응답을 가로채서 변경할 수 있다.
특징
- Spring 에서 모든 요청을 하나의 서블릿인 DispatcherServlet 에서 처리하는 것처럼 하나의 특별한 필터인 DelegatingFilterProxy 에 의해 활성화 된다.
- DelegatingFilterProxy 는 스프링 부트의 자동 구성으로 컨테이너에 등록되고 모든 요청을 가로챈다.
Filter 를 등록하는 방법
@Configuration
- 설정을 위한 별개의 파일(@Configuration 이 붙은 객체)이 필요하다.
- setOrder() 를 통해 순서를 정할 수 있다.
- addUrlPatterns() 을 통해 베이스 URL 및 Whitelist를 설정할 수 있다.
@Configuration
public class FilterConfiguration {
/**
* 로그 관련 필터 추가.
*
* @return
*/
@Bean
public FilterRegistrationBean loggingFilter() {
FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<>();
filterRegistrationBean.setFilter(new LoggingFilter());
filterRegistrationBean.setOrder(1);
filterRegistrationBean.addUrlPatterns("/*");
return filterRegistrationBean;
}
}
@**Component**
- 설정을 위한 별개의 파일이 필요하지 않는다.
- @Order 애노테이션을 이용해 순서를 설정할 수 있다.
- 기본 URL Pattern이 /* 이며 설정할 수 없다.
@Slf4j
@Component // 추가된 두 가지
@Order(1) // 추가된 두 가지
public class LoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
// 전처리
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String url = httpServletRequest.getRequestURI();
log.info(url);
filterChain.doFilter(servletRequest, servletResponse); // 다음 Filter 로 이동
}
}
@WebFilter + @ServletComponentScan
- 설정을 위한 별개의 파일이 필요하지 않는다.
- 대신, 애플리케이션 실행되는 메인 객체위에 @ServletComponentScan 을 사용해야 한다.
- @Order를 이용한 순서 등록을 사용할 수 없다.
- 각 필터에 대한 순서를 보장할 수 없다.
- @WebFilter 의 value 나 urlPatterns 파라미터를 이용해 whitelist 방식으로 베이스 URL을 설정할 수 있다.
- @WebFilter("/filter/*")
- @WebFilter({"/login", "/items"})
- @WebFilter(urlPatterns = "/filter/*")
- @WebFilter(urlPatterns = {"/login", "/items"})
@Slf4j
@WebFilter
public class LoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
// 전처리
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String url = httpServletRequest.getRequestURI();
log.info(url);
filterChain.doFilter(servletRequest, servletResponse); // 다음 Filter 로 이동
}
}
@ServletComponentScan
@SpringBootApplication
public class FilterPatternApplication {
/**
* main.
*
* @param args argument.
*/
public static void main(String[] args) {
SpringApplication.run(FilterPatternApplication.class, args);
}
}
@WebFilter + @Component
- 2번째 방법과 3번째 방법을 모두 사용하는 방법이다.
- 설정을 위한 별개의 파일이 필요하지 않는다.
- 컴포넌트 스캔 방식을 사용하기 때문에 @ServletComponentScan 도 필요없다.
- @Order 애노테이션을 이용해 순서를 설정할 수 있다.
- @WebFilter 의 value 나 urlPatterns 파라미터를 이용해 베이스 URL이나 Whitelist 방식으로 설정할 수 있다.
- @WebFilter("/filter/*")
- @WebFilter({"/login", "/items"})
- @WebFilter(urlPatterns = "/filter/*")
- @WebFilter(urlPatterns = {"/login", "/items"})
- 어노테이션이 기본으로 3개가 필요하다.
@Slf4j
@WebFilter
@Component
@Order(1)
public class LoggingFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
// 전처리
HttpServletRequest httpServletRequest = (HttpServletRequest) servletRequest;
String url = httpServletRequest.getRequestURI();
log.info(url);
filterChain.doFilter(servletRequest, servletResponse); // 다음 Filter 로 이동
}
}
내마음대로 cs , 개발자 면접에 대해 정리를 했다.
'TIL' 카테고리의 다른 글
TIL - 2024/07/01 (0) | 2024.07.01 |
---|---|
TIL - 2024/06/28 (0) | 2024.06.28 |
TIL - 2024/06/25 (0) | 2024.06.25 |
TIL - 2024/06/24 (0) | 2024.06.24 |
TIL - 2024/06/21 (0) | 2024.06.21 |