Java Spring & Web Backend Study 1

박지훈·2020년 12월 29일
0

Java Spring과 Web Backend를 학습한 내용을 정리해보았습니다.


Spring Framework



Spring 3대 요소

  1. IoC : 제어의 역전 --> 비즈니스 컴포넌트를 개발할 때 항상 신경쓰는 것이 바로 낮은 결합도 높은 응집도이다. Spring은 제어의 역행을 통해 애플리케이션을 구성하는 객체 간의 느슨한 결합(낮은 결합도)를 유지한다. Spring의 IoC는 객체 생성을 자바 코드로 직접 처리하는 것이 아닌 컨테이너가 대신 처리한다. 그리고 객체-객체 사이의 의존관계 역시 컨테이너가 처리한다. (내가 직접 안해도 됨)

    • Bean

    • @Controller

    • @Component

    • @Service

    • @Repository

    • DI


  • DI : 의존성 주입 --> 의존성 관계란 객체와 객체의 결합 관계이다. 하나의 객체에서 다른 객체의 변수나 메소드를 이용해야 한다면, 이용하려는 객체에 대한 객체 생성 및 레퍼런스 정보가 필요하다. 의존성은 new라고 생각하면 쉽다. A라는 객체 생성자에서 new B();를 했다면 A는 B에 의존하게 된다. A라는 객체에서 B를 생성하는 것이 아닌 외부에서 생성된 B를 A에 주입함으로써 의존 관계를 없앨 수 있다. 이것을 의존성 주입이라고 한다.

    • @Autowired
    • @Inject

  1. AOP : 관점 지향 프로그래밍 --> DI가 의존성 주입이라면 AOP는 로직 주입이라고 할 수 있다. 코드를 구현할 때 다수의 모듈에 공통적으로 나타나는 부분이 존재하는데 모듈마다 중복되는 부분을 걷어내는 것이 AOP의 주된 목적이다. 핵심 비즈니스 로직과 각 비즈니스 메소드마다 반복해서 등장하는 공통 로직을 분리함으로써 응집도가 높게 개발할 수 있도록 지원한다.

    • 컴파일) A.java ---(AOP)---> A.class ===> AspectJ

    • 바이트코드 조작) A.java ---> A.class ---(AOP)---> (Ex) 메모리에만 StopWatch 코드가 삽입된다고 생각

    • 프록시 패턴) 기존의 코드를 건드리지 않고 새 기능 추가함. 즉, 메소드들 사이에 코드를 반복적으로 삽입할 필요X // AOP와 비슷한 GoF 패턴이 있다. 언제 어떻게 사용해야하나 -> 원래 서로 비슷한 패턴이 많다. 패턴의 목적에 맞게 사용하면 된다고 한다.

  2. PSA : 서비스 추상화 --> JDBC처럼 Adapter 패턴을 적용하여 같은 일을 하는 다수의 기술을 공통의 인터페이스로 제어할 수 있게 한 것을 서비스 추상화라고 한다. Spring Framework에서는 서비스 추상화를 위해 다양한 Adapter를 제공. OXM, ORM, 캐시, 트랜잭션 등 다양한 기술에 대한 PSA(API)를 제공한다.

    • Spring Web MVC // Spring Transaction // Spring Cache

    • 잘 만든 인터페이스라고 생각하면 된다.

    • 내가 학습하고 있는 Spring-petclinic 예제를 보면 Servlet Application임에도 불구하고 Servlet 파일이 전혀 존재하고 있지 않음 --> 단지 @Controller 어노테이션이 붙어있는 클래스에서 @GetMapping, @PostMapping, @RequestMapping 어노테이션을 이용하여 요청 --> 실제 내부적으로 Servlet 기반으로 코드가 동작하지만 Servlet 기술은 추상화 계층에 의해 숨겨져 있음!! --> 이렇게 추상화 계층을 사용하여 어떤 기술을 내부에 숨기고 개발자에게 편의성을 제공해주는 것을 SA(Service Abstraction)이라고 한다.

출처 : https://asfirstalways.tistory.com/334
https://dailyworker.github.io/spring-triangle/




MVC 패턴

출처 : https://medium.com/@jang.wangsu/%EB%94%94%EC%9E%90%EC%9D%B8%ED%8C%A8%ED%84%B4-mvc-%ED%8C%A8%ED%84%B4%EC%9D%B4%EB%9E%80-1d74fac6e256

  • 소프트웨어 아키텍처 패턴 중 하나로 3가지 형태(Model, View, Controller)로 역할을 나누어 개발하는 방법론.

  • Model : "무엇"을 할 것인지 정의하는 역할 - 내부 비지니스 로직 처리 (처리되는 알고리즘, DB와 상호작용, 데이터 등등)

  • View : 화면에 무엇을 "보여주기" 위한 역할 - 모델이나 컨트롤러가 보여주려고 하는 모든 필요한 것들을 보여줌 (UI)

  • Controller : Model이 "어떻게" 처리할 지를 알려주는 역할 - 모바일에서는 화면의 로직처리 부분. 화면에서 사용자의 요청을 받아서 처리되는 부분을 구현 --> 요청 내용을 분석하여 Model과 View에 업데이트 요청 (사용자로 부터 입력을 받고 Model 또는 View의 중개인 역할)



Spring MVC Framework

  • Spring이 제공하는 트랜잭션 처리, DI, AOP를 손쉽게 사용가능

  • 스트럿츠2와 같은 Framework와 연동이 쉬움



Servlet

  • 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 Java Web Programming 기술 = Java를 사용하여 Web을 만들기 위해 필요한 기술

  • 클라이언트가 어떠한 요청을 하면 그에 대한 결과를 다시 전송해야함
    (Ex) 사용자 로그인 --> id, pw 입력 --> 로그인 버튼 클릭 --> 이 때 서버는 id, pw 확인 --> 이후 다음 페이지 띄워야하는데 이러한 것을 Servlet이 수행 (Servlet을 Java로 구현된 *CGI라고 흔히 말함)

특징

  • 클라이언트 요청에 대해 동적으로 작동하는 Web Application 컴포넌트

  • HTML을 사용하여 요청에 응답

  • Java Thread를 이용하여 동작

  • MVC 패턴에서 Controller로 이용됨

  • HTTP 서비스를 지원하는 javax.servlet.http.HttpServlet 클래스를 상속받는다.

  • UDP보다 속도가 느림

  • HTML 변경 시 Servlet 컴파일을 다시 해야하는 단점이 존재



Lombok (라이브러리)

  • Java에서 @Getter, @Setter와 같은 어노테이션 기반으로 관련 기존 DTO, VO, Domain Class를 작성할 때, 멤버 변수에 대한 Getter / Setter / ToString() 등과 멤버 변수에 값을 설정하는 생성자 등을 자동으로 생성해주는 라이브러리.
    "Lombok을 쓰면 Spring 실력이 늘지 않는다는 괴담을 들었다..."

(Ex) Lombok를 사용하면 VO 클래스에 Getter, Setter 메소드를 일일이 작성할 필요 없이 @Getter, @Setter 어노테이션 작성만으로 가능하다.



Thymeleaf (템플릿 엔진)

  • 개발의 workflow를 natural templates로 가지고 올 수 있다는 것 (공식문서에 이렇게 나와있다.)

  • --> 그래서 natural templates가 뭔데??
    natural templates : HTML처럼 보이고 HTML처럼 사용할 수 있음

<th th:text= "#{msgs.headers.name}">Price</th>

위는 thymeleaf 문법으로 쓰여짐. HTML 템플릿은 항상 마크업 언어 태그 안쪽에 속성으로 씀. 따라서 HTML 페이지처럼 보이고 실제로 동작하는 것, 이것을 natural templates라고 부름. (아직도 이해가 잘 안된다...)
장점으로는 Tomcat 등의 서버가 동작하지 않아도 HTML 페이지가 잘 보여 마크업을 쉽게 수정 가능하며 전체적인 마크업 구조를 흐트리지 않는 장점이 존재한다. 또한, 디자인과 개발이 분리되어 효율성이 향상

  • th:text 속성을 사용해서 서버를 통한 값을 주입시킨다. WAS 서버 돌리지 않고 해당 파일을 열 경우 <th>Price</th>라는 구문만 인식하므로 HTML에는 Price가 출력

장점

  1. natural templates : HTML처럼 보이고 HTML처럼 사용할 수 있음

  2. WAS 서버 필요 없이 파일을 브라우저를 통해 띄울 수 있음 (브라우저가 해석 가능한 마크업 언어만 존재하기 때문) -> 퍼블리셔와 협업이 용이

  3. 오직 HTML에는 마크업 언어만 존재하기 때문에 마크업 구조를 망치지 않아 가독성이 뛰어남.



JWT (JSON Web Token)

  • JWT는 웹 표준(RFC7519)으로써 두 개체에서 JSON 객체를 이용하여 가볍고 자가수용적인 방식으로 정보를 안정성있게 전달해준다.

  • JWT는 필요한 모든 정보를 자체적으로 지니고 있다. (이것이 자가수용적의 의미!!) --> 두 개체 사이에서 손쉽게 전달될 수 있음. 웹 서버의 경우 HTTP 헤더에 넣어서 전달하거나 URL의 파라미터로 전달할 수 있음.

  • JWT System에서 토큰 발급 --> 토큰에 대한 기본 정보, 전달할 정보((ex) 로그인 시스템의 유저 정보) & 토큰이 검증됐다는 것을 증명해주는 signature를 포함

  • C, Java, Python, C++, R, C#, PHP, JavaScript, Ruby, Go, Swift 등 대부분 주류 프로그래밍 언어에서 지원됨.

JWT 구성

aaaaaa(헤더-header). bbbbbb(내용-payload). cccccc(서명-signature)
  1. Header : 2가지 정보를 지님
    -> type = 토큰의 type을 지정 (JWT)
    -> alg = 해싱 알고리즘 (HMAC, SHA256, RSA) - 토큰을 검증할 때 사용되는 signature부분에서 사용됨

  2. Payload : 토큰에 담을 정보가 들어있음 / 정보의 한 조각을 claim 이라고 부름
    -> claim = (name + value) 한 쌍으로 구성 / 토큰에는 여러개의 claim을 넣을 수 있음)
    -> [claim] : 등록(registered) / 공개(public) / 비공개(private) 3 분류로 이루어져있음

  3. Signature : Header의 인코딩값 + 정보의 인코딩값을 합친 후 주어진 비밀키로 해쉬하여 생성 / 만들어진 해쉬를 Base64 형태로 나타냄



원리 실습

@Controller 
public class DoubleController { 

    @RequestMapping("/apple") 
    private String showAppleView(){ 
        return "apple"; 
    } 
   
    @RequestMapping("/banana") 
    private String showBananaView(){ 
    return "banana"; 
    } 

    @RequestMapping("/grape") 
    private String showGrapeView(){ 
    return "grape"; 
    } 

} 


// 아래는 JSP 페이지의 내용 
<p><a href="./apple">apple view 이동</a></p>
<p><a href="./banana">banana view 이동</a></p>
<p><a href="./grape">grape view 이동</a></p> 

@Controller 어노테이션 이용 --> @RequestMapping("~")를 붙여 해당 URL로 클라이언트 요청 --> return값의 .jsp, .html 페이지 반환!!



assertThat() (JUnit)

  • Java Test

  • assert 메소드는 많은 종류가 있음

  • 기존의 assert 방식에서 나중에 나온 메소드로 자유롭게 검증할 수 있는 조건을 만들어줌.

// 구조
assertThat( 검사할 데이터(비교 대상의 실제값), Matcher (비교 로직) )

(Ex) result = 3 + 7;
assertThat(result, is(10)); --> True !!





Maven (Apache Ant 대안)

  • Java용 프로젝트 관리도구 (=빌드 도구)

  • 프로젝트의 전체적인 생명 주기를 관리하는 도구

  • 필요한 라이브러리를 특정 문서(pom.xml)에 정의해놓으면 내가 사용할 라이브러리뿐만 아니라 해당 라이브러리가 작동하는데 필요한 다른 라이브러리들까지 관리하여 네트워크를 통해 자동으로 다운받아준다.

(Ex) JDBC 연동하려면 --> MySQL Connector.jar 있어야 함 --> But 다른 누군가 코드를 실행하려면 똑같이 MySQL Connector.jar 있어야함 ==> 이러한 불편함을 없애기 위해 Maven 등장함!



[컴파일](기계어로 번역) --> [링커](파일 여러개 연결) --> [빌더](실행 및 배포)

빌드

  • 소스코드 파일을 컴퓨터에서 실행할 수 있는 독립 SW 가공물로 변환하는 과정 or 그에 대한 결과물

  • 내가 작성한 코드(Java), 파일 및 자원(.xml, .jar, .jpg, .properties) --> JVM or WAS((ex) Tomcat)이 인식할 수 있는 구조로 패키징하는 과정 및 결과물



빌드 도구

  • 프로젝트 생성, 테스트 빌드, 배포 등의 작업을 위한 전용 프로그램

  • 빠른 기간동안 늘어나는 라이브러리 추가 및 프로젝트를 진행하면서 라이브러리의 버전 동기화의 어려움을 해소하고자 등장한 프로그램

profile
Computer Science!!

0개의 댓글