TIL

TIL - 2024/06/26

기석김 2024. 6. 26. 19:11

팀 프로젝트가 끝났다. 다음 프로젝트 시작전까지 약 2주라는 시간이 있다. 이 시간동안 강의와 밀린 문법 + 개인과제

할게 산더미다. 정말 열심히 이 시간을 잘써야 최종 프로젝트때 내가 배운 지식들을 잘 갈아 넣을 수 있을것이다.

 

3 Layer Architecture란?

1. Controller

  • 클라이언트의 요청을 받는다
  • 요청에 대한 로직 처리는 Service에게 전담
    • Request 데이터가 있다면 Service에 같이 전달
  • Service에서 처리 완료된 결과를 클라이언트에게 응답함

2. Service

  • 사용자의 요구사항을 처리 ('비즈니스 로직') 하는 실세 중에 실세
    • 따라서 현업에서는 서비스 코드가 계속 비대해지고 있다
  • DB 저장 및 조회가 필요할 때는 Repository에게 요청

3. Repository

  • DB 관리 (연결, 해제, 자원 관리) 합니다.
  • DB CRUD 작업을 처리합니다.

정리

 

 

JPA의 주요 기능

  1. ORM (Object-Relational Mapping)
    • JPA는 자바 객체와 데이터베이스 테이블 간의 매핑을 제공합니다. 이를 통해 개발자는 객체 지향적인 방식으로 데이터베이스를 사용할 수 있으며, 복잡한 SQL 쿼리 대신 자바 객체를 사용하여 데이터를 관리할 수 있습니다.
  2. 데이터베이스 독립성
    • JPA는 특정 데이터베이스에 종속되지 않고 다양한 데이터베이스 시스템과 호환됩니다. 이를 통해 개발자는 데이터베이스 변경 시 최소한의 코드 수정으로도 대응할 수 있습니다.
  3. 표준화된 API
    • JPA는 자바 EE 및 자바 SE 환경 모두에서 사용할 수 있는 표준화된 API를 제공합니다. 이는 다양한 JPA 구현체(예: Hibernate, EclipseLink, OpenJPA 등) 간의 일관된 프로그래밍 인터페이스를 의미합니다.
  4. 쉬운 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 , 개발자 면접에 대해 정리를 했다.

https://kiseokkm.tistory.com/91

 

[CS] 개발자 면접 대비: 내 마음대로 기술 질문 정리 ②

인터페이스와 추상 클래스의 차이점에 대해 설명하세요.추상 클래스는 객체의 추상적인 상위 개념으로 공통된 개념을 표현할 때 사용하고, 단일 상속만 가능합니다.그리고 추상 클래스를 상속

kiseokkm.tistory.com