CheerUp_Cheers

웹 본문

CS

meorimori 2020. 5. 9. 02:04

#질문[ETC]

  • WAS와 웹서버 차이(WAS,WEB Sever) 그리고 아파치, 톰캣
  • 컨테이너?
  • 스프링은 왜 나왔고, 핵심기술은(POJO,DI,IOC,AOP,PSA)?
  • 프레임워크란?
  • 스프링부트 로거는 왜쓸까?
  • 스프링부트란? 스프링부트의 장점?
  • Mybatis란?
  • JDBC?
  • EJB? JPA란? Hibernate?
  • REST API
  • OAuth
  • JWT
  • 네이티브 앱 & 웹 & 하이브리드 앱
  • Vue.js와 React

 

 


  • WAS와 웹서버 차이(WAS,WEB Sever) 그리고 아파치, 톰캣

 

#웹서버

- 클라이언트가 서버에 페이지 요청을 하면 요청을 받아 정적 컨텐츠(html, png. css)를 제공하는 서버

- 클라이언트에서 요청이 올 떄 가장 앞에서 요청에 대한 처리.

 

동작)

[1] 정적 컨텐츠? => HTML, PNG 응답.

[2] 동적 컨텐츠? => WAS에 처리 부탁 => WAS가 처리해준 컨텐츠를 받은 웹서버는 응답.

 

 

#WAS

- 동적 컨텐츠를 제공하기 위해 만들어진 애플케이션 서버(DB조회, 로직처리 컨텐츠)

- JSP, Servlet 구동 환경 제공.

- 컨테이너, 웹컨테이너, 서브릿 컨테이너라고 부름.

 

 컨테이너 - JSP, Servlet
 WAS 종류 : Tomcat, Jeus, JBoss

동작)

[1] 웹서버로 부터 요청 -> 컨테이너가 받아서 처리

[2] 컨테이너는 web.xml을 참조하여 해당 서블릿에 대한 쓰레드 생성

  HttpServletRequest와 httpServletResponse 객체를 생성 전달.

[3] 컨테이너는 서블릿을 호출.

[4] 호출된 서블릿의 작업을 담당하게 된 쓰레드(2번에서 만든)는 doPost()또는 doGet()호출.

[5] 호출된 doPost(), doGet()메소드는 생성된 동적 페이지를 Response객체에 담아 컨테이너에 전달.

[6] 컨테이너는 전달받은 Response객체를 HTTPResponse형태로 바꿔 웹서버에 전달하고 생성되었던 쓰레드를 종료하고 httpServletRequest, httpServletResponse 객체를 소멸.

 

#차이

- 동적 컨텐츠를 처리를 수행가능한가?

WAS는 정적, 동적 둘다 가능하지만 부하가 많이걸림.

 

- 성능 떄문인가?

톰캣5.5 이상부터는 httpd의 native모듈을 사용해서 정적파일을 처리하는 기능을 제공하는데 이것이 순수 아파치 Httpd만 사용하는 것과 비교해서 성능이 전혀 떨어지지 않기 때문이다.

그럼에도 톰캣앞에 아파치를 두는 이유는 하나의 서버에서 php애플리케이션과 java애플리케이션을 함께 사용하거나, httpd 서버를 간단한 로드밸런싱을 위해서 사용해야 할 때 필요하기 때문

 


  • 컨테이너?

컨테이너 : 보통 인스턴스의 생명주기를 관리, 생성된 인스턴스들에게 추가적인 기능을 제공.

#종류

 

1)IOC/DI 컨테이너

 객체에 대한 생성 및 생명주기를 관리할 수 있는 기능 제공.

 객체의 생성을 책임지고, 의존성을 관리.

 POJO의 생성,초기화,서비스,소멸에 대한 권한가짐( 개발자들이 직접 할수 있찌만 안함)

 

2)서블릿 컨테이너

 Servlet의 생성, 생성후 초기화, 서비스 실행, 소멸에 관한 모든 권한.

 

3)스프링 컨테이너(2가지)

 스프링 프레임워크의 핵심부, 의존성 주입을 통해 애플리케이션을 구성하는 컴퍼넌트 관리.

 작성한 코드는 프로그래머의 손에서 떠나 호출된 컨테이너가 동작.

 

 - BeanFactory

   Bean을 등록,생성,조회,반환,관리

   팩토리 디자인 패턴을 구현한 것으로, 빈을 생성하고 분배하는 책임을 짐.

 - ApplictaionContext

   빈의 기능과 같음.

   리스너로 등록된 빈에게는 이벤트 발생을 알려줌.

   이미지같은 파일 자원을 로드할 수 있는 포괄적인 방법 제공.

 

 - 차이점

   BeanFactory : 처음으로 GetBean()이 호출된 시점에서야 해당 빈을 생성(Lazy Loading, 게으른 호출)

   ApplicationContext : 컨텍스트 초기화 시점 모든 싱글톤 빈을 미리 로드. bean의 지연없이 얻음(미리 bean생성)


  • 프레임워크란?

복잡한 문제를 해결하거나 서술하는 데 사용되는 기본 개념 구조.
프레임워크를 기반으로 한  개발은 일정한 개발형식을 뜀.

틀, 뻐대 -> 기반 -> 다양한 컴포넌트와 개발 패턴을 제공함 -> 대충 다만들어져있음.

ex)자동차 만드는것이 다 비슷하니까 틀을 만들어서 생산.

 

#특성

재사용성과 확장성을 키움

유지관리성에 이익이 있음.

 


  • 스프링은 왜 나왔고, 핵심기술(POJO,DI,IOC,AOP,PSA)?

#탄생과정

1) EJB는 엔터프라이즈 애플리케이션을 쉽게 작성할 수 있도록하는 목표
  -> EJB컨테이너를 사용해야하는 제약, 유지보수성 저하와 생산성 저하.

2) 자바로 엔터프라이즈 애플리케이션을 개발을 더 쉽게 하기 위해 스프링 탄생.

 

#핵심기술

1)POJO(Plain Old Java Object)

2)DI(Dependency Injection)

3)IOC(Inversion of Control)

4)AOP(Aspect Orited Porgramming)

5)PSA(Portable Service ABstraction)

 

#POJO

본래 자바의 장점을 살리는 오래된 방식의 순수한 자바객체
객체 지향원리 충실, 환경과 기술에 종속되지 않고 필요에 따라 재활용. (의존을 줄이자)

POJO란 객체지향적인 원리에 충실하면서, 특정 환경과 규약에 종속되지 않아 필요에 따라 재사용될 수 있는 방식으로 설계된 오브젝트.

 

#DI

https://velog.io/@wlsdud2194/what-is-di

의존성 주입은 필요한 객체를 직접 생성하는 것이 아닌 외부로 부터 필요한 객체를 받아서 사용하는 것이다.
ex) 커피를 상속하는 카푸치노, 아메리카노

 

특징

  • Unit Test가 용이해진다.
  • 코드의 재활용성을 높여준다.
  • 객체 간의 의존성(종속성)을 줄이거나 없엘 수 있다.
  • 객체 간의 결합도이 낮추면서 유연한 코드를 작성할 수 있다.

 

#IOC

제어의 역전, 의존적 주입, 외부에서 제어를 한다는 것.
객체의 생성, 생명주기의 관리 까지 모든 객체에 대한 제어권이 바뀌었따는 것을 의미.

인스턴스의 생성부터 소멸까지의 인스턴스 생명주기 관리를 개발자가 아닌 컨테이너가 해준다는 뜻.

 

#AOP

관점 지향 프로그래밍.
핵심기능(BoardService, UserService)에서 부가 기능(before(), after())의 측면에서 공통된 요소를 추출하자.

가로(횡단) 영역의 공통된 부분을 잘라냈다고 하여, 크로스 컷팅이라고 불리기도 함.

공통된 기능을 재사용하자는 기법

 

1) 장점

  - 어플리케이션 전체에 흩어진 공통 기능이 하나의 장소에서 관리된다는 점.

  - 다른 서비스 모듈들이 본인의 목적에만 충실하고, 그외 사항을 신경쓰지 않아도 됨.

 

#PSA

PSA : 환경의 변화에 관계없이 일관된 방식의 기술로의 접근 환경을 제공하려는 추상화 구조.

Spring을 사용할때 내부 구현이 달라지더라도, 동일한 인터페이스로 같은 구동이 가능하게 끔 설계

-> 의존성을 고려할 필요가 없음.


  • 스프링부트 로거(Logger)는 왜쓸까?

 

#레벨

INFO(trace > debug > info > warn > error)

 

logger.trace("trace -- Hello world.");
logger.debug(
"debug -- Hello world.");
logger.info(
"info -- Hello world.");
logger.warn(
"warn -- Hello world.");
logger.error(
"error -- Hello world.")

 

#이유

1) 에러나 장애가 발생할 때 해당 내용을 재현하기 위한 기초 자료로 사용하기 위함이며

2) 사용자 로그의 경우 분석 데이터로 활용하기 위해서다.

3) 별다른 설정을 하지 않아도 로그를 사용할 수 있음.

 

 


  • 스프링부트란? 스프링부트의 장점?

스프링 부트 : 스프링이라는 자바 프레임워크의 프로젝트를 말하며, 이를 사용하면 쉽게 애플리케이션 제작.

- 메이븐 : pom.xml

- Gradle : build.gradle, 클래스패스, 어노테이션, 기타 자바구성클래스

위의 자동 구성.

 

#특징

1) 자주 사용하는 프로젝트 조합을 미리 만들어놈

  -> 일일히 라이브러리를 추가해줄 필요없이 Spring-boot-web을 메이븐 설정만 해주면 받아옴.

2) 설정을 자동으로 수행.

   @Enableautoconfiguratio  어노테이션의 같은경우 자동설정해주는 녀석으로 스프링부트의 마법이라고 불리웁니다.

비슷한 어노테이션으로 @SpringBootApplication 이 있음.

3) 서버를 포함.(Tocat, Jetty, Undertow)

   Tomcat 내장서버를 포함하고있음.

   -> 기존에 톰캣을 설치하여 이클립스 연동하는 작업이 없어짐.

4) 설정을 위한 XML 코드를 생성하거나 요구하지 않음.

5) 단독으로 실행이 가능한 스프링 애플리케이션을 생성함.

 

 


  • Mybatis란?

관계 DB 프로그래밍을 도와주는 개발 프레임 워크.
프로그램에 있는 SQL쿼리들을 한 구성파일에 구성하여 프로그램 코드와 SQL 분리

#구성

1) MyBatis 환경설정 파일(sqlSessionConfig.xml)

  MyBatis가 JDBC 코드를 실행하는데 필요한 전반에 걸친 세팅

2) Mapper 설정 파일(prodcut.xml)

  SQL문과 관련된 설정을 하는 파일.

 

#특징

사용자 정의 DTO, MAP으로 맵핑하여 사용 가능.

프로그램 코드와 SQL쿼리의 분리로 코드의 간결성 및 유지 보수성 향상. : 기존은 DAO파일에

생산성이 높아짐 : 코드가 짧아짐.

 

 


  • JDBC?

다양한 관게형 데이터베이스 프로그래밍을 위해 API를 제공.
자바 프로그램이 데이터베이스와 연결되어 데이터를 주고받게하는 프로그래밍 인터페이스

 

#과정

[1] JDBC 드라이버 로딩

  사용가능하도록 메모리에 로딩

[2] DBMS 서버 접속

  DB서버와의 접속(getConnection)

[3] Statement

  DB쪽으로 SQL문을 전송하고, 결과를 자바 프로그램으로 가져오는 객체.

[4] SQL문 실행

  ResultSet : executeQuery()의 결과값을 가지는 객체.

[5] 자원해제

  Connection : Db 연결 객체

  Statement | PreparedStatement : SQL문 실행 객체

  ResultSet 객체 : select문 결과를 가지는 객체.

 

#JDBC 드라이버

JDBC 드라이버들은 자바 프로그램의 요청을 DBMS가 이해할 수 있는 프로토콜로 변환해주는 클라이언트 사이드 어댑터이다. (서버가 아닌 클라이언트 머신에 설치)

 


  • EJB? JPA란? Hibernate?

셋다 관계형 디비 테이블을 자바 객체로 맵핑 시켜 사용. (ORM)
재사용성이 좋다.
객체로 쿼리 결과가 자동 맵핑.

 

#EJB

 과거의 자바 표준

 과거의 ORM(Object-relational mapping)

 문제?

   - 코드가 매우 지저분

   - API 복잡성이 높음(인터페이스 많이 구현)

   - 속도가 느림.

 

#Hibernate(하이버네이트)

 ORM 프레임워크, Open Source SW

 

#JPA

 1) 현재 자바 진영의 ORM 기술 표준, 인터페이스의 모음!

  -> 실제로 동작 X, JPA 인터페이스를 구현한 대표적인 오픈소스가 Hibernate.

 2) JPA 표준 명세를 구현한 3가지 구현체 : 하이버네이트, 이클립스 링크

 

JPA는 애플리케이션과 JDBC 사이에서 동작.

 -> 개발자가 JPA를 사용하면, JPA내부에서 JDBC API를 사용하여 SQL 호출하여 DB와 통신.

 -> 즉 개발자가 직접 JDBC API를 쓰는게 아님.

 

!왜쓰나요

 1) SQL 중심적인 개발에서 객체 중심으로 개발.

 2) 생산성

  JPA를 사용하는 것은 마치 자바 컬렉션에 데이터를 넣고 빼는것처럼 사용 가능.

  CRUD가 간단 : 특히, Update! 객체를 변경하면 DB에 수정 쿼리가 나감

 3) 유지보수

  기존 : 필드 변경 시 모든 SQL을 수정

  JPA : 필드만 추가하면됨, SQL은 JAP가 처리하기 떄무넹 손댈것 없음.

 4) 객체와 데이터베이스의 불일치 패러다임 해결

 


  • REST API

# REST의 요소

 - Method

  POST, GET, PUT, DELETE

 - Resource

  URL, 명사로 표현

 - Message

 메시지 포맷이 존재(JSON, XML)

 

# Rest 특징

 - Uniform Interface

 HTTP표준만 맞다면 어떤기술로도 가능한 인터페이스 스타일

 ex) HTTP + JSON 이나 HTTP + XML이나, 플랫폼이나 언어에 종속 X

 

 - StateLessness

 Http Session같은 컨텍스트 저장소에 상태정보 저장 안함

 요청에 대한 처리만 하면됨.

 


  • OAuth

인터넷 사용자들이 다른 웹사이트 상의 자신들의 정보에 대한 접근권한을 부여 받음.

타사 앱 및 웹사이트에 계정에 대한 정보 공유 가능.

ex) 구글,페이스북,트위터

 

#토근종류

 - Access Toekn : 만료시간이 있고 끝나면 다시 요청

 - Refresh Token : 만로되면 아예 처음부터 진행

 


  • OAuth

JSON 객체를 사용하여 가볍.

WT는 ' . '을 구분자로 3가지 문자열로 구성

헤더, 내용, 서명

 

#헤더

typ는 토큰의 타입 지정

 ex) "typ" : "JWT"

ALG는 해싱 알고리즘을 지정

 ex) "alg" : "HMAC | SHA256 | RSA"

 

#정보(페이로드)

정보의 한조각을 클레임이라 함.

name/value로 한쌍.

클레임을 여러개 넣을수 있지만 토큰이 길어짐.

 

#서명

서명은 헤더의 인코딩값과 정보의 인코딩값을 합친후 주어진 비밀키로 해쉬를 하여 생성합니다.

이렇게 만든 해쉬를 base64형태로 나타내게 됩니다.

 

#로그인 인증시 JWT

유효기간 짧으면 자주로그인, 길면 토큰 탈취시 보안취약

-> Refresh Token 사용!

 

- 어떻게?

 AccesToken이 유효기간이 만려되면 Refresh토근이 새로 발급하는 열쇠.

 AccessToken은 1시간, Refresh Toekn은 1주.

 AccessToken으로 api요청하다가 만료되면 Refresh Token이 새로 발급.

 Refresh Toekn이 만료되면 새로 로그인!'

 -> 둘다 탈취 가능성이 있어 적절한 유효기간 설정 필요.


  • 네이티브 앱 & 웹 & 하이브리드 앱

#네이티브 앱

모바일 기기에 최적화된 언어로 개발된 앱(안드로이드, 스위프트)

 

- 장점

 성능이 가장 좋음

 네이티브 API로 플랫폼과 밀착

 

- 단점

 플랫폼에 한정적

 언어의 제약

 

#모바일 웹 앱

모바일웹의 특징을 가지면서도 네이티브의 장점 가짐.

웹앱은 SPA를 활용해 속도가 빠름

 

- 장점

 웹사이트를 보는것이라 따로 설치 없음

 모든기기와 브라우저 접근

 

- 단점

 플랫폼 API사용 불능, 브라우저 API만

 친화적 터치 앱 개발의 번거로움

 브라우저 열기로 들어가야함

 

#하이브리드 앱

네이티브 앱에, 웹 VIEW를 뛰어 웹앱을 실행

 

- 장점

 네이티브 API, 브라우저 API를 모두 활용한 다양한 개발 가능

 웹개발 기술로 앱개발 가능

 한번의 개발로 다수 플랫폼

 

- 단점

 네이티브 기능 접근은 개발지긱 필요.

 

 

'CS' 카테고리의 다른 글

알고리즘 심화  (0) 2020.05.15
알고리즘 정렬기본  (0) 2020.05.15
디자인 패턴  (0) 2020.02.18
ETC  (0) 2020.02.11
네트워크  (0) 2020.02.11