New World

[JAVA #6] Servlet, JSP & JDBC & JPA 본문

Self-Study/Study

[JAVA #6] Servlet, JSP & JDBC & JPA

hyeovi 2022. 10. 5. 22:44
728x90
반응형

Servlet, JSP

Servlet

  • Container가 이해할 수 있게 구성된 순수 자바 코드로만 이루어진 것(Html in JAVA)
  • 웹 페이지를 동적으로 생성하기 위한 서버 측 프로그램
  • 웹 어플리케이션 서버 위에서 컴파일 되고 동작

JSP

  • Java Server Page, html기반에 JAVA코드를 블록화하여 삽입하여 동적 웹페이지가 됨(JAVA in Html)
  • jsp가 실행되면 자바 서블릿으로 변환되며 웹 어플리케이션 서버에서 동작되면서 필요한 기능을 수행하고 그 데이터를 웹페이지와 함께 클라이언트로 응답

? 서블릿이 뭔가요?

컨테이너가 이해할 수 있도록 순수 자바 코드로만 이루어진 파일

 

? Spring Web MVC의 Dispatcher Servlet의 동작 원리에 대해서 간단히 설명해주세요.

Spring MVC의 구조와 처리과정

  • DispatcherServlet : 어플리케이션으로 들어오는 모든 Request를 받는 곳. Request를 실제로 처리할 Controller에게 전달하고 그 결과값을 받아 View에게 전달하여 적절한 응답등 생성할 수 있도록 흐름 제어
  • HandlerMapping : Request URL 각각을 어떤 Controller가 실제로 처리할 것인지 찾아주는 역할
  • Controller : Request를 직접 처리한 후 그 결과를 다시 DispatcherServlet 에게 돌려줍니다.
  • ModelAndView : Controller가 처리한 결과와 그 결과를 보여줄 View에 관한 정보를 담고 있는 객체
  • ViewResolver : View 관련 정보를 갖고 실제 View를 찾아주는 역할
  • View : Controller가 처리한 결과값을 보여줄 View를 생성

? Servlet Filter와 Spring Interceptor의 차이는 무엇인가요?

Servlet Filter Interceptor
javax.servlet 스펙에 포함되는 클래스 Spring MVC 스펙에 포함되어 있는 클래스
Servlet에서 전후처리를 담당 Spring에서 Handler를 실행하기 전후

ViewResolver를 통해 컨트롤러에서 리턴한 View Name으로부터 렌더링을 담당할 View 오브젝트를 준비해 돌려준 후 실제 View를 렌더링한 후에 어떠한 처리를 담당
Web Application에 등록 (Tomcat을 사용할 경우 web.xml) Spring의 Application Context에 등록
Method Signature에 있는 Argument인 HttpServletRequest 혹은 HttpServeltResponse를 ServletRequest, ServletResponse 등으로 교체할 때 사용

데이터 변환(다운로드 파일의 압축 및 데이터 암호화 등), XSL/T를 이용한 XML 문서 변경, 사용자 인증, 자원 접근에 대한 로깅 등에 사용
AOP를 흉내내거나, Spring 애플리케이션에서 전역적으로 전후처리 로직에서 예외를 사용

Handler Method에서 사용자의 권한을 체크해서 다른 동작을 시켜준다거나 할 때 사용

 

? Filter는 Servlet의 스펙이고, Interceptor는 Spring MVC의 스펙입니다. Spring Application에서 Filter와 Interceptor를 통해 예외를 처리할 경우 어떻게 해야 할까요?

Filter는 DispatcherServlet 외부에 존재하여 예외가 발생했을 때 ErrorController에서 처리

Interceptor는 DispatcherServlet 내부에 존재하기 때문에 @ControllerAdvice를 적용해서 처리

 

JDBC

  • Java Data Base Connection
  • JAVA 언어를 통해 데이터 베이스에 접근 할 수 있는 자바 API
  • 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공

*myBatis : JDBC를 좀더 편하게 사용할 수 있도록 객체를 SQL이나 저장 프로시저와 매핑 해주는 프레임워크로 SQL구문을 Java 메소드와 매핑해준다

 

Get과 Post 방식

Get 방식

  • 클라이언트에서 서버로 데이터를 전달할 때, HTTP Request Message의 Header 부분에 url에 "이름"과 "값"이 결합된 스트링 형태로 전달
  • 주소창에 쿼리 스트링이 그대로 보여지기 때문에 보안성이 떨어진다.
  • 길이에 제한이 있다. (=전송 데이터의 한계가 있다.)
  • Post방식보다 상대적으로 전송 속도가 빠르다.

Post 방식

  • 일정 크기 이상의 데이터를 보내야 할 때 사용한다.
  • 서버로 보내기 전에 인코딩하고, 전송 후 서버에서는 다시 디코딩 작업을 한다.
  • 주소창에 전송하는 데이터의 정보가 노출되지 않아 Get방식에 비해 보안성이 높다.
  • 속도가 Get방식보다 느리다.
  • 쿼리스트링(문자열) 데이터 뿐만 아니라, 라디오 버튼, 텍스트 박스 같은 객체들의 값도 전송가능.

 

* HTTP METHOD

HTTP METHOD에는 get, post, put, delete 가 있다.

get : 클라이언트에서 서버로 어떠한 리소스로부터 정보를 요청하기 위해 사용되는 method

post : 리소스를 생성/ 업데이트하기 위해 서버에 데이터를 보내는 데 사용되는 method로 서버상의 데이터 값이나 상태를 바꾸기 위해서 사용한다.

주요 차이점으로는,  get 요청은 캐시가 되나, post는 캐시되지 않습니다. get은 브라우저에 기록되지만 post는 기록되지 않습니다.

 

? GET/POST의 차이는?

GET은 데이터를 전달할 때, POST는 데이터 값이나 상태를 바꾸기 위해 사용되며 get은 url에 값을 옮겨주기 때문에 브라우저에 기록되지만 post는 값을 보여주지 않아 보안성이 높습니다

 

JPA

Java Persistence API
Java 에서 ORM 기술 표준으로 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스

Hibernate, OpenJPA 등이 JPA를 구현함

 

* ORM : Object Relational Mapping의 약자로 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것

객체 지향 프로그래밍은 클래스를 사용하고, 관계형 데이터베이스는 테이블을 사용한다.

 

 

? JPA 영속성 컨텍스트의 이점(5가지)을 설명해주세요.

영속성 컨텍스트 : 엔티티를 영구 저장하는 환경을 의미

 

영속성 컨텍스트 속성

  • 비영속 : 영속성 컨텍스트와 전혀 무관한 상태로 순수한 객체의 상태 (처음 객체가 생성되면 비영속 상태)
  • 영속 : 영속성 컨텍스트에 저장된 상태
  • 준영속 : 영속성 컨텍스트에서 관리하다, 영속성 컨텍스에서 분리된 상태, 준영속 상태는 영속 상태 였던 적이 있기 때문에 @Id 값을 반드시 가지고 있다.
  • 삭제 : 삭제된 상태

 

영속성 컨텍스트를 쓰는 이유

  • 1차 캐시: 조회가 가능하며 1차 캐시에 없으면 DB에서 조회하여 1차 캐시에 올린다.
  • 동일성 보장: 동일성 비교가 가능하다
  • 쓰기 지연: 트랜잭션을 지원하는 쓰기 지연이 가능하며 트랜잭션 커밋하기 전까지 SQL을 바로 보내지 않고 모아서 보낼 수 있다
  • 변경 감지(Dirty checking): 스냅샷을 1차 캐시에 들어온 데이터를 찍어 commit 되는 시점에 Entity와 스냅샷과 비교하여 update SQL을 생성한다
  • 지연 로딩: 엔티티에서 해당 엔티티를 불러올 때 그 때 SQL을 날려 해당 데이터를 가져온다

 

? JPA Propagation 전파단계를 설명해주세요.

JPA Propagation : 트랜잭션 동작 도중 다른 트랜잭션을 호출(실행)하는 상황에 선택할 수 있는 옵션

@Transactional의 propagation 속성을 통해 피호출 트랜잭션의 입장에서는 호출한 쪽의 트랜잭션을 그대로 사용할 수도 있고, 새롭게 트랜잭션을 생성할 수도 있다.

 

REQUIRED(디폴트): 부모 트랜잭션 내에서 실행하며 부모 트랜잭션이 없을 경우 새로운 트랜잭션을 생성합니다.

REQUIRES_NEW :

SUPPORTS :

MANDATORY :

NOT_SUPPORT :

NEVER :

NESTED :

 

? JPA를 쓴다면 그 이유에 대해서 설명해주세요.

객체지향 프레임워크으로 비즈니스 로직이 RDBMS에 의존하는 것이 아니라, 자바 코드로 표현될 수 있다. 그로 인해서 생산성이 높아진다고 볼 수 있습니다. database dialect를 지원하여 JPQL로 SQL을 추상화하여 RDBMS Vendor에 관계없이 동일한 쿼리를 작성해서 같은 동작을 기대할 수 있다는 장점도 가지고 있다.

 

?N + 1 문제는 무엇이고 이것이 발생하는 이유와 이를 해결하는 방법을 설명해주세요.

N + 1 쿼리 문제는 즉시 로딩과 지연 로딩 전략 각각의 상황에서 발생할 수 있다. 하위 엔티티들이 존재하는 경우 한 쿼리에서 모두 가져오는 것이 아닌, 필요한 곳에서 각각 쿼리가 발생하는 경우 생긴다

 

즉시 로딩

JPQL을 사용하는 경우 전체 조회를 했을 때, 영속성 컨텍스트가 아닌 데이터베이스에서 직접 데이터를 조회한 다음 즉시로딩 전략이 동작하여 생긴다


지연 로딩

지연로딩 전략을 사용한 하위 엔티티를 로드할 때, JPA에서 프록시 엔티티를 unproxy 할 때 해당 엔티티를 조회하기 위한 추가적인 쿼리가 실행되어 발생한다

 

해결 방법

Fetch Join이라고 불리는 JPQL의 join fetch를 사용하는 방법이 있으며, 또 다른 방법으로는 @EntityGraph를 사용하는 방법, @Fetch(FetchMode.SUBSELECT)를 사용하는 방법, @BatchSize를 사용해 조절하거나 전역적인 batch-size를 설정하는 방법이 있다.

 

 

  • Hibernate는 뭘까요?
  • Open Session In View
  • JPA 사용할때랑 직접 SQL 사용할때랑 어떤 차이?
  • @transactional 동작 과정
    1. readOnly 붙인 이유
  • JPA FetchType
    1. LAZY와 EAGER 각각 어떤 기준으로 사용하시는지?
  • N+1 문제
  • 엔티티 매핑을 할 때 ManyToOne을 lazy로 설정해주지 않았던 이유
  • JPA 사용하면서 맞닥뜨린 문제 있는지?
  • 본인이 생각하기에 칼럼이 많고 적고의 기준은 어떻게 되는지?
  • JPA에서 PK는 어떻게 설정하는지?

 

반응형
Comments