Skip to content

Instantly share code, notes, and snippets.

@sigridjineth
Last active March 13, 2020 14:20
Show Gist options
  • Save sigridjineth/f53b8e954beb0dcffb97d38e3d176cda to your computer and use it in GitHub Desktop.
Save sigridjineth/f53b8e954beb0dcffb97d38e3d176cda to your computer and use it in GitHub Desktop.
java-qna 1단계 학습정리

QNA Step 1 학습 질문

  • spring boot로 로컬 개발 환경을 세팅할 수 있는가?

    • 자동화 빌드 도구로 Gradle을 활용한다.
    • 소스코드를 컴파일하고 JAR 형태로 패키징하여 배포하는 일을 자동화한다.
    • 그루비라는 스크립트 언어를 활용한다.
    • 일반적으로 maven 저장소를 주로 사용하지만, jcenter라는 저장소도 사용한다.
    • buildscript라는 프로젝트 전체의 전역변수를 설정할 수 있다.
    • 의존성 적용을 위한 버전을 plugin을 통해 적용하거나 새롭게 설정할 수 있다.
    • dependencies를 통해 추가적인 버전을 추가할 수 있다.
  • mustache, handlebars와 같은 template engine의 역할을 이해했는가?

    • 템플릿 엔진은 서버에서 받아온 데이터를 뷰에 뿌려주는 중간 매개체이다.
    • 혹자는 전문 재봉업자에 비교하기도 한다 해당 문서
    • 서버 사이드 템플릿 엔진은 서버에서 DB 또는 API에서 가져온 데이터를 미리 정의된 템플릿에 넣어 HTML을 그려서 클라이언트에 전달하는 역할을 한다.
    • HTML 코드에서 고정적으로 사용되는 부분은 템플릿으로 만들어두고 동적으로 생성되는 부분만 템플릿 특정 장소에 끼워넣는 방식으로 동작할 수 있도록 해준다.
    • 클라이언트 사이드 템플릿 엔진은 HTML 형태로 코드를 작성할 수 있으며 데이터를 받아서 DOM 객체에 동적으로 그려주는 프로세스를 담당한다.
    • 주로 단일 화면에서 특정 이벤트에 따라 화면이 계속 변경되어야 하는 경우에 JavaScript로 HTML을 렌더링해준다.
    • 스프링 부트에서는 템플릿 엔진으로 Handlebars, Mustache를 주로 사용한다.
    • 장점으로 1) 많은 코드를 줄일 수 있다 2) 재사용성이 높다 3) 유지보수에 용이하다를 꼽을 수 있다.
    • 참고: https://gmlwjd9405.github.io/2018/12/21/template-engine.html
  • MVC 패턴에서 model view controller 각각의 역할을 이해했는가?

    • Model: 데이터를 처리하는 영역
    • View: 결과 화면을 보여주는 자원
    • Controller: 웹의 요청을 처리하는 존재로 View와 Model 사이의 통신 흐름을 제어
    • MVC 구조를 확장하면 5가지 계층으로 나누어 구성할 수 있다. Web Layer, Service Layer, Repository Layer, DTOs 그리고 Domain Model이 있다.
    • Web Layer: Controller와 View 템플릿 영역이 있다. 외부 요청과 응답에 대한 전반적인 역할을 담당한다.
    • Service Layer: Controller와 DAO 사이에서 실제 데이터 처리를 제어하고 조절하는 영역이다. @Transaction이 사용되어야 한다.
    • Repository Layer: 데이터 저장소에 접근하는 영역이다. DAO 영역이라고도 불린다.
    • DTOs: 계층 간에 데이터 교환을 위한 객체이다. POJO 스러우며 로직을 담지 않는다. 예를 들어 Repository Layer에서는 뷰 화면에 출력하기 위해 직접 엔티티를 넘기지 않고 Dtos 객체를 넘긴다. VO라고도 불린다.
    • Domain Model: 개발 대상을 객체화한 것으로, 객체 지향의 개념을 담는다. 데이터베이스의 테이블과 일반적으로 관계가 있다.
  • 웹 클라이언트에서 웹 서버에 요청을 보내고, 응답을 받는 흐름을 이해했는가?

    • 정보의 자원을 표현하는 URL이 HTTP 규격에 맞는 GET, POST, PUT, DELETE 등의 요청을 API로 보낸다.
    • 웹 서버는 HTTP 요청을 받아 처리한 후 이에 맞는 응답 코드를 보낸다. (200 OK, 404 ERROR 등)
  • Spring MVC 기반으로 CRUD 기본 기능을 구현할 수 있는가?

    • JPA를 활용한다.
    • 객체를 만들고 @Entity를 활용하여 데이터베이스에 매핑한다.
    • JpaRepository, CrudRepository 등을 상속받아 save, findAll 등의 메소드를 활용한다.
    • @Query 어노테이션을 활용하면 JPQL을 활용하여 객체 간의 관계를 활용한 SQL 문법을 사용할 수 있다.
  • javabean 표준에 대해 알고 있는가?

    • 모든 클래스의 프로퍼티는 private이며 getter와 setter로 제어한다.
    • 인자가 없는 public 생성자가 있어야 한다.
    • Serializable 인터페이스를 구현해야 한다.
    • Serializable 즉 직렬화란 자바 시스템 내부에서 사용되는 Object 또는 Data를 외부의 자바 시스템에서도 사용할 수 있도록 byte 형태로 데이터를 변환하는 기술이다. https://nesoy.github.io/articles/2018-04/Java-Serialize
    • POJO는 자바빈과 유사한데, 순수하게 getter와 setter 메소드로만 이루어진 Value Object 스타일의 Bean이다.
  • ORM의 역할에 대해 이해했는가?

  • ORM 기반으로 CRUD 기능을 구현할 수 있는가?

    • Hibernate를 활용하여 Repository가 CrudRepository 또는 JpaRepository를 상속받도록 구현한다.
    • Spring Data JPA가 지원하는 어노테이션을 활용하거나 직접 JPQL을 활용해서 구현한다.
  • HTTP는 무상태 프로토콜이라는 말의 의미를 이해했는가?

    • Stateless 하다는 것은 1) 이전의 요청과 관계가 없는 독립적인 요청을 보내고 2) 세션 정보와 상태 보관을 요구하지 않는다.
    • HTTP의 모든 전송 규격(GET, POST, PUT, DELETE)는 그 자체로 상태를 담지 못하므로 쿠키와 세션을 활용한다.
    • stateless 프로토콜은 특정 서버와 계속 연결 상태에 있을 필요가 없으므로 확장성에 유리하고 클라이언트가 서버와 의존성이 없기 때문에 클라이언트가 어느 서버에 접속하든지 상관이 없다. 단순하고 서버 측 부담이 없다.
    • http://codemonkeyism.com/stateless-applications-illusion/
  • HTTP는 상태를 유지하기 위해 cookie를 사용한다. cookie의 동작 방식을 이해했는가?

    • HTTP는 클라이언트가 응답을 받으면 연결을 끊어버리고, 통신이 끝나면 상태를 유지하지 않는다.
    • 따라서 쿠키라는 키-값으로 이루어진 작은 데이터 파일을 활용하여 클라이언트와 소통한다.
    • 브라우저는 쿠키를 일정한 장소에 보관하고 있는다.
    • 서버는 Set-Cookie header 값으로 상태를 유지하고 싶은 값을 클라이언트에 보낸다.
    • 클라이언트는 Set-Cookie header에 담겨 있는 값을 꺼내서 Cookie Header에 담아 서버로 발송한다.
    • 서버는 Cookie Header 값을 비교하면서 이전의 사용자인지 대조하는 역할을 수행한다.
  • cookie와 session의 차이점은 무엇인지 이해했는가?

    • 세션은 쿠키에 기반한다. 하지만 쿠키는 브라우저에서 관리하지만 세션은 서버에서 관리한다.
    • 서버는 클라이언트를 구분하기 위해 별도의 세션 ID를 만든다. 브라우저를 종료할 때까지 세션을 유지한다.
    • 사용자 정보를 서버에 두므로 보안상 유리하지만 서버 부하가 올 수 있다.
    • 클라이언트는 서버에 접속하면 세션 ID를 발급받고, 이에 대한 정보를 쿠키로 보관하고 있는다.
    • 클라이언트는 서버에 요청할 때 쿠키에 담긴 세션 ID를 서버에 전달해서 사용한다.
    • 서버는 쿠키에 담긴 세션 ID를 활용하여 서비스를 제공한다.
    • 쿠키와 세션의 차이는 사용자의 정보가 브라우저에 저장되느냐, 서버에 저장되느냐의 차이가 있다. https://interconnection.tistory.com/74
  • Spring MVC에서 Session을 활용해 로그인 기반 개발이 가능한가?

    • HttpSession에서 setAttribute를 하면 특정한 객체 또는 오브젝트를 저장할 수 있다.
    • 서블릿이라는 데이터 저장 영역에서 HttpSession을 관리한다.
  • Logging 라이브러리 필요성을 이해했는가?

    • 로그는 기록을 남기는 것이다. 하지만 자동으로 남겨주지는 않고 프로그래머가 직접 설정해주어야 한다.
    • System.out.println에 비해 파일을 직접 생성하지 않으므로 유지보수 효율 향상에 기여할 수 있다.
  • Logging 라이브러리를 설정할 수 있는가?

    • 다음 스텝에서 진행할 예정이다.
  • 이번 미션에서 공부한 주제 중에서 학습하기 가장 어려웠던 것은 어떤 것인가요?

    • JPA가 어려웠다. 객체-관계 매핑이 이해가 잘 되지 않았고 지금도 어떻게 동작하는 지 잘 모르겠다.
    • 내가 이해한 것은 객체 간의 관계를 매핑하기 위해서 객체를 넘겨주면 알아서 PK가 상대 측의 FK로 엮여져서 자동으로 관리된다는 것이다. 띠용?
  • Spring MVC 처리 순서

    • 클라이언트가 서버에 요청을 하면 스프링에서 제공하는 DispatcherServlet, 즉 프론트 컨트롤러가 요청을 가로챈다.
    • 요청을 가로챈 DispatcherServlet은 HandlerMapping에게 어떠한 컨트롤러에 요청을 위임할 지 물어본다.
    • 요청에 매핑된 컨트롤러가 있을 경우 @RequestMapping을 통하여 요청을 전달할 메소드에 도달한다.
    • 컨트롤러는 해당 요청을 처리할 Service를 DI 형태로 주입받아 비즈니스 로직을 Service에 위임한다.
    • Service에서는 요청에 필요한 작업을 대부분 처리하며 데이터베이스에 접근이 필요할 경우 DAO를 주입받아 DB 처리를 위임한다.
    • DAO는 주로 Hibernate인데, 영속성 컨텍스트를 설정하거나 JPQL 쿼리를 날려 DB를 수정하고 Service에 돌려준다.
    • 이 때 DTO 또는 VO는 쿼리의 결과를 담아 계층 간에 전달하는 역할을 수행한다.
    • 모든 로직을 끝낸 Service가 결과를 컨트롤러에게 넘긴다.
    • 결과를 받은 컨트롤러는 Model 객체에 어떠한 View 파일을 보여줄 것인지 내용을 담아 DispatcherServlet에게 보낸다.
    • DispatcherServlet은 ViewResolver에게 View에 대한 정보를 넘긴다.
    • ViewResolver는 해당 JSP를 찾아서 응답할 View를 설정한 다음 DispatcherServlet에게 알려준다.
    • DispatcherServlet은 응답할 View에게 Render를 지시하고 View는 응답 로직을 처리한다.
    • 결국 DispatcherServlet이 클라이언트에게 렌더링된 View를 응답한다.
    • https://jeong-pro.tistory.com/96
  • 그 외에 학습하기 어렵거나 시간이 오래 걸린 것은 무엇이고, 어떻게 극복했나요?

    • 학습에 Dion님의 PR, Han님의 PR, Jack/Diane님의 PR이 큰 도움이 되었다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment