no image
REST API
👉REST란 REST란 Representational State Transfer의 약자로 자원을 이름으로 구분하여 해당 자원(Resourse)의 상태를 주고 받는 모든 것을 의미한다. 즉, 자원의 표현에 의한 상태 전달이다. 자원의 표현은 그 자원을 표현하기 위한 이름을 의미하고 상태 전달은 데이터가 요청되는 시점에서 자원의 상태를 전달하는것이다.일반적으로 JSON 이나 XML을 통해 데이터를 주고 받는 것이 있다. WWW(World Wide Web)과 같은 분상 하이퍼미디어 시스템을 위한 소프트웨어 개발 아키택쳐의 한 형식이다.REST는 기본적으로 웹의 기존의 기술과 HTTP프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키택쳐이다. REST의 자세한 개념은 HTTP URI를 통..
2021.10.09
Dev
no image
서버확장 : 스케일 업(Scale Up) , 스케일 아웃(Scale Out)
애플리케이션을 개발할때 이용고객을 100명 정도로 예상하고 서버를 구축했다.그러나 생각보다 이용고객들이 많아져서 1000명이 이용한다. 여기서 기존에 사용하던 서버는 한계가 있다. 그래서 스케일 업과 스케일 아웃으로 인프라를 제구성 해야한다. 일단 스케일 업과 스케일 아웃의 개념을 알아보자 💻스케일 업(Scale Up) 스케일 업(Scale Up)은 쉽게 말해서 서버의 덩치를 키우는 것이다. 사용중인 서버 자체 성능을 증강 시켜 처리능력을 향상 시키는 것으로 CPU를 업그레이드 시키거나 RAM을 추가하는 방법으로 하드웨어 장비의 성능을 높이는 접근 방법이다. 스케일 업(Scale Up)은 비교적 접근하기도 수월하고 , 구현하기도 쉽다.예를 들어 게임을 시작했는데 기존의 컴퓨터가 게임하기에는 너무 낮은 사..
2021.09.30
DataBase Engine(데이터 베이스 엔진)
데이터베이스 엔진(DataBase Engine) 또는 스토리지 엔진(Storage Engine)은 데이터베이스 관리시스템(DBMS)이 데이터베이스에 대해 데이터를 삽입 ,추출,업데이트 및 삭제하는데 사용하는 기본 소프프웨어 컴포넌트이다. 데이터베이스 엔진을 조작할 때 DBMS 고유의 사용자 인터페이스를 이용하는 방법과 포트 번호를 통해 이용하는 방법이 있다.DBMS은 사용자 인터페이스를 통하지 않고, 사용자가 내장된 엔진과 상호작용을 할 수 있는 자신만의 애플리케이션 프로그래밍 인터페이스를 포함하고 있다. MYSQL DB의 스토리지엔진이란 스토리지엔진은 DB에서 데이터를 어떠한 방식으러 저장하거 접근할 것인지에 대한 기능을 제공한다.스토리지 엔젠의 특성에 따라 데이터 접근이 얼마나 빠른지, 얼마나 안정적..
2021.09.28
Dev
[Spring] 어노테이션으로 로그인 여부 확인(Interceptor)
프로젝트 진행 중 컨트롤러의 메서드가 로그인 여부를 확인하는 부가기능을 동시에 처리하는 경우가 존재한다. 이런식으로 반복되는 로직을 AOP,Interceptor,Filter 등을 통해 반복되는 부가기능을 공통적으로 처리할 수 있다. 로그인 확인이 필요한 경우 프로젝트를 진행하다가 보면 로그인 없이 접근 가능한 페이지가 있고 로그인을 한 경우에만 접근이 가능한 페이지가 존재한다. 예를들어 마이페이지,비밀번호 변경,상품 등록하기 등이 있다. Interceptor를 적용하기 전 로그인 확인 과정 세션에서 현재 로그인된 사용자의 정보를 꺼내온다. 세션에서 꺼낸 값이 Null이라면 , 해당 사용자는 로그인을 하지 않은 상태이므로 401 UNAUTHORIZED를 반환한다. 만약 정상적으로 session에서 로그인 ..
2021.09.21
no image
[DB]트랜잭션(transaction)
➡️트랜잭션 트랜잭션은 DBMS가 데이터베이스를 다룰 때 사용하는 작업의 단위이다. 트랜잭션은 데이터베이스의 무결성을 유지하기 위해 원자성, 고립성, 지속성의 성질을 갖는다.DBMS는 트랜잭션이 이러한 성질을 유지할 수 있도록 지원한다. 데이터베이스에서 데이터를 다룰 때 장애가 일어나는경우에 데이터를 복구하는 작업의 단위가 된다. 데이터베이스에서 여러 작업이 동시에 같은 데이터를 다룰 때 서로 분리하는 단위가 된다. ➡️트랜잭션의 수행 과정 아래와 같은 트랜잭션의 수행 과정은 2가지 방법으로 나눠진다. 방법 1 : 1 - 2 - 3 - 4 - Commit - 5 - 6 방법 2 : 1 - 2 - 3 - 4 - 5 - 6 - Commit +@Commit은 트랜잭션의 수행이 완료가 된것을 트랜잭션 관리자에게..
2021.09.14
no image
[DB]이상현상(Anomly), 함수 종속성 (Functional Dependency)
👉이상현상(Anomly) 삭제 이상 : 튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상이다. 삽입 이상 : 튜플 삽입 시 특정 속성에 해당하는 값어 Null값을 입력해야 하는 현상이다. 수정 이상 : 튜플 수정 시 중복된 데이터의 일부만 수정되어 일어나는 데이터 불일치 현상이다. 아래 사진에서 장미란이라는 학생 정보를 지울결루 강의실 103도 같이 사라진다.이 현상이 삭제 이상이다. 박지성 학생과 김연아 학생 같은 수업을 110호에서 수강을 한다. 그런데 두 강의는 독립적으로 입력된 데이터이기 때문에 박지성 학생에서 강의실을 201호로 변경하여도 김연아 학생은 110호로 데이터가 그대로 유지되고, 같은 데이터베이스 수업임에도 불구하고 강의실이 달라지는 현상이 발생한다.이 현상이 수정 이..
2021.09.13
no image
[DB] 정규화(Normalization)
📁정규화(Normalization) 정규화는 테이블 간에 중복을 허용하지 않는다는 목표를 가지고 있다. 중복된 데이터를 허용하지 않으므로써 무결성을 유지할 수 있고, 데이터 베이스 용량 또한 줄일수 있다. 테이블이 어떻게 분리되는지에 따라 정규형 단계가 달라진다. 📁제 1 정규형 제 1 정규형은 릴레이션의 모든 속성 값이 원자값을 가지는 경우이다. 아래 그림처럼 추신수 선수의 취미가 (영화,음악)으로 원자값이 아니다.속성 값이 원자 값이 아닐 경우 원자 값을 갖도록 변환 해주어야한다. 고객취미들(이름,취미들) 릴레이션을 고객취미(이름,취미)릴레이션으로 바꾸어 저장하면 제 1 정규형에 만족한다. 📁제 2 정규형 제 2 정규형은 릴레이션이 제 1 정규형을 만족하고, 기본키가 아닌 속성이 키본키에 완전 함수 ..
2021.09.11
no image
[Spring] AOP(Aspect Oriented Programming)
📖 AOP(Aspect Oriented Programming) 개발을 하다보면 공통적인 기능이 많이 발생한다. 이러한 공통 기능을 모든 모듈에 적용하기 위해 상속을 하지만 자바에서는 다중상속이 불가능해서 상속을 받아 공통 기능을 부여하기에는 한계가 있다. AOP를 사용하지 않는다면 중복 코드가 발생할 소지가 있고, 코드의 변경이 필요하면 여러코드에 종속적으로 변경이 필요하고 핵심 비즈니스 로직에 호출 시간 측정이라는 부수적인 로직이 추가되어 가독성과 효율성이 떨어지는 문제가 발생한다. 이러한 문제점을 해결하기 이해서는 AOP가 필요하다.AOP는 새로운 프로그래밍 패러다임이 아니라 객체 지향 프로그래밍(OOP)를 돕는 보조적인 기술로, 핵심적인 관심사항과 공통 관심사항으로 분리 시키고 각각을 모듈화 하는 ..
2021.09.10

REST API

ryudjae
|2021. 10. 9. 11:52
728x90

👉REST란 

REST란 Representational State Transfer의 약자로 자원을 이름으로 구분하여 해당 자원(Resourse)의 상태를 주고 받는 모든 것을 의미한다.

즉, 자원의 표현에 의한 상태 전달이다. 자원의 표현은 그 자원을 표현하기 위한 이름을 의미하고 상태 전달은 데이터가 요청되는 시점에서 자원의 상태를 전달하는것이다.일반적으로 JSON 이나 XML을 통해 데이터를 주고 받는 것이 있다.

WWW(World Wide Web)과 같은 분상 하이퍼미디어 시스템을 위한 소프트웨어 개발 아키택쳐의 한 형식이다.REST는 기본적으로 웹의 기존의 기술과 HTTP프로토콜을 그대로 활용하기 때문에 웹의 장점을 최대한 활용할 수 있는 아키택쳐이다.

REST의 자세한 개념은  HTTP URI를 통해 자원을 명시하고,HTTP Method(POST,GET,PUT,DELETE)를 통해 해당 자원에 대한 CRUD 작업을 적용 하는것이다.

REST는 자원 기반의 구조 설계의 중심에  자원(Resourse)가 있고 HTTP Method를 통해 자원을 처리하도록 설계된 아키텍쳐이다.

 

👉REST가 필요한 이유

  • 애플리케이션의 분리 및 통합 
  • 다양한 클라이언트 등장
  • 서버프로그램은 다양한 브라우저와 안드로이드 ,아이폰 등 모바일 디바이스에서도 통신이 가능해야한다.

👉REST의 장단점

  • 장점
    • REST API를 사용하기위해 별도로 인프라를 구축할 필요가 없다.
    • HTTP 표준 프로토콜에 따르는 모든 플랫폼이 사용가능하다.
    • 하이퍼미디어API 의 기본을 충실히 지키면서 범용성을 보장한다.
    • 서버와 클라이언트 역할 분리가 확실하다.
    • HTTP 프로토콜의 표준을 최대한 활용하여 추가적인 장점을 함께 가져갈 수 있게 해준다.
  • 단점 
    • 명확한 표준이 존재하지 않는다.
    • HTTP Method형태가 제한적이다.
    • 구형 브라우저는 아직 제대로 지원해주지 못해 PUT,DELETE를  사용하지 못한다.

👉REST의 구성요소 

  • 자원(Resourse)
    • 모든 자원에는 고유한 ID가 존재하고, 이 자원은 Server에 존재한다.
    • 자원을 구별하는 고유한 ID는 HTTP URI이다.
    • 클라이언트는 URI를 이용해서 자원을 선택하고 해당 자원의 상태에 대한 조작을 Server에 요청한다.
  • 행위(Verb)
    • HTTP 프로토콜은 GET, POST, PUT, DELETE 와 같은 메서드를 제공한다.
  • 표현(Representations)
    • 클라이언트가 자원의 상태에 대한 조작을 요청하면 Server는 이에 적정한 응답을 보낸다.
    • REST에서 하나의 자원은 JSON, XML, TEXT, RSS 등 여러 형태의 Representation으로 나타내어 질 수 있다.
    • JSON 혹은 XML를 통해 데이터를 주고 받는 것이 일반적이다.

👉REST 특징 

  • Server-Client
    • 자원이 있는 쪽이 Server, 자원을 요청하는 쪽이 Client가 된다.
      • Server : API를 제공하고 비즈니스 로직 처리 및 저장을 책임진다.
      • Client : 사용자 인증이나 context등을 직접 관리하고 책임진다.
    • 서로 간의 의존성이 줄어든다.
  • Stateless(무상태)
    • HTTP 프로토콜은 Stateless Protocol이므로 REST 또한 무상태성을 갖는다.
    • 클라이언트의 context를 서버에 저장하지 않는다.(세션과 쿠키와 같은 context정보를 신경쓰지 않아도 되므로 구현이 단순해진다.)
    • 서버는 각각의 요청을 완전히 별개의 것으로 인식하고 처리한다.
      • API서버는 Client의 요청만을 처리한다.
      • 이전 요청이 다음요청에 영향을 주어서는 안된다.(DB를 수정하여 DB에 의해 바뀌는 것은 상관없음)
      • 서버의 처리 방식에 일관성을 부여하고 부담이 줄어들어 서비스의 자유도가 높아진다.
  • Cacheable
    • HTTP프로토콜을 사용하므로 웹에서 사용하는 기존의 인프라를 그대로 활용가능하다.(대표적으로 캐싱기능 사용가능)
    • 대량의 요청을 효율적으로 처리하기 위해 캐시가 요구된다.
    • 캐시 사용을 통해 응답시간이 빨리지고 REST 서버 트랜잭션이 발생하지 않기 때문에 전체 응답시간이나 성능, 서버의 자원 이용률을 향상 시킬수 있다.
  • Layered System
    • 클라이언트는 REST API 서버만 호출한다.
    • REST 서버는 다중 계층으로 구성 가능하다.(로드밸런싱,공유캐시 등을 통해 확장성과 보안성을 향상시킬 수 있다.)
    • 네트워크 기반의 중간 매체를 사용할 수 있다.(EX: proxy,Gateway)
  • Code-on-Demand
    • 서버로 부터 스크립트를 받아서 Client에서 실행한다.
  • Uniform Interface
    • URI로 지정한 Resourse에 대한 조작을 통일되고 한정적인 인터페이스로 수행한다.
    • HTTP 표준을 따르는 모든 플랫폼에서 사용가능하다.

 

👉REST API란 

API(Application programming Interface)

  • 데이터와 기능을 모아서 컴퓨터 프로그램간에 상호작용을 촉진하며, 서로 정보를 교환가능 하도록 하는것

REST API

 

  • REST API는 REST기반으로 API를 구현한 것이다.
  • REST 기반으로 시스템을 분상해 확장성과 재사용성을 높여 유지보수 및 운용을 편리하게 할수있다.
  • REST는 HTTP 기반으로 구현하므로,HTTP를 지원하는 프로그램언어로  클라이언트 ,서버를 구현할 수 있다.

👉REST API  설계  규칙

URI는 정보의 자원을 표현해야 한다.

  • 리소스는 동사보다 명사,대문자보다는 소문자를 사용한다.
  • 리소스는 도큐먼트 이름으로는 단수 명사를 사용해야 한다.
  • 리소스의 컬렉션 이름으로는 복수 명사를 사용해야 한다.
  • 리소스의 스토어 이름으로는 복수 명사를 사용해야 한다.
    • EX) GET /Member/1 -> GET /members/1

리소스에 대한 행위는 HTTP Method(GET, PUT ,POST DELETE)로 표현한다.

  • URI에 HTTP Method가 들어가면 안된다.
    • EX)GET /store/delete/1  -> DELETE /stores/1
  • URI에 행위에 대한 동사 표현이 들어가면 안된다.
    • EX)GET /store/show/1  -> GET /stores/1
    • EX)GET /store/insert/12  -> POST /store/1
  • 경로 부분 중 변하는 부분은 유일한 값으로 대체한다.
    • id = 1 인 상품 삭제하는 route : DELETE/product/1

👉설계 규칙

  • 슬래시(/)는 계층 관계를 나타내는데 사용한다.
    • EX)http://localhost.com/product/1
  • URI 마지막 문자로 슬래시(/)를 포함하지 않는다.
    • URI에 포함되는 모든 글자는 리소스의 유일한 식별자로 사용되어야 한다.
    • URI 경로 마지막에는 슬래시(/)를 사용하지 않는다.
    • EX)http://localhost.com/product/1/  (X)
  • 하이픈( - )은 가독성을 높이는데 활용한다.
    • 긴 URI경로를 사용하게되면 하이픈을 사용해 가독성을 높인다.
  • 밑줄(_)은 URI에 사용하지 않는다.
    • 문자에 가려질수 있으므로 밑줄은 사용하지 않는다.
  • URI경로에는 소문자가 적합하다.
    • RFC 3986은 URI 스키마와 호스트를 제외하고는 대소문자를 구별하도록 규정하기 때문에 대문자를 사용하지 않는다.
  • 파일확장자는 URI에 포함하지 않는다.
    • REST API에서는 메시지 바디 내용의 포맷을 나타내기 위한 파일 확장자를 URI 안에 포함시키지 않는다.
    • Ex) http://localhost.com/product/1/photo.jpg (X)
      Ex) GET /product/1/photo HTTP/1.1 Host: localhost.com Accept: image/jpg (O)

 


📁REFERENCE

 

 

728x90

'Dev' 카테고리의 다른 글

[AWS]EC2에 JDK 11설치하기  (0) 2021.10.25
세션 관리 전략  (0) 2021.10.21
DataBase Engine(데이터 베이스 엔진)  (0) 2021.09.28
프록시(Proxy)란  (0) 2021.07.26
객체 지향 프로그래밍(OOP)  (0) 2021.06.16
728x90

애플리케이션을 개발할때 이용고객을 100명 정도로 예상하고 서버를 구축했다.그러나 생각보다 이용고객들이 많아져서 1000명이 이용한다. 여기서 기존에 사용하던 서버는 한계가 있다. 그래서 스케일 업스케일 아웃으로 인프라를 제구성 해야한다.

 

일단 스케일 업과 스케일 아웃의 개념을 알아보자 

 

💻스케일 업(Scale Up)

https://butter-shower.tistory.com/109

스케일 업(Scale Up)은 쉽게 말해서 서버의 덩치를 키우는 것이다. 사용중인 서버 자체 성능을 증강 시켜 처리능력을 향상 시키는 것으로 CPU를 업그레이드 시키거나 RAM을 추가하는 방법으로 하드웨어 장비의 성능을 높이는 접근 방법이다.

스케일 업(Scale Up)은 비교적 접근하기도 수월하고 , 구현하기도 쉽다.예를 들어 게임을 시작했는데 기존의 컴퓨터가 게임하기에는 너무 낮은 사양이어서 컴퓨터를 바꾸거나 RAM을 추가하거나 CPU를 교체하는것이 스케일 업(Scale Up)과 가장 유사하다 조금 극단적이지만 컴퓨터를 새로 사는것도 스케일업이라고 볼수 있다.

 

스케일 업(Scale Up)의 장단점

  • 장점
    • 하드웨어만 추가/교체하는 작업이기 때문에 구현과 설계가 쉽다.
    • 여러대의 서버를 두는것 보다 데이터 정합성 이슈에서 자유롭다.
    • 컨트롤러나 네트워크 인프라 비용이 추가적으로 발생하지 않는다.
  • 단점
    • 용량, 성능 확장의 한계가 있다. 가장 좋은 CPU와 가장 큰 용량의 RAM을 사용하더라도 그것을 초과하는 성능으로 업그레이드 하는것은 불가능하다.
    • 스케일 업의 수준이 일정 수준을 넘어가면 성능 증가 폭이 작아진다.
    • 하나의 서버가 모든 사용자의 트래픽을 담당해야하기 때문에 해당 서버에 문제가 생길 경우 문제를 해결하기 전까지 서버를 중단해야하는 큰 문제가 발생할 수 있다.

 

 

💻스케일 아웃(Scale Out)

https://butter-shower.tistory.com/109

스케일 아웃이란 기존 서버와 비슷한 사양의 서버의 대수를 추가해 여러대의 서버를 두고 운영하는 방식이다.

스케일업에 비해서 다소 유연한 방법이다.서버가 여래대가 되기 때문에 각서버에 걸리는 부하를 균등하게 해주는 로드밸런싱이 필요하다.

컴퓨터 한대가 고장나더라도 다른 컴퓨터가 있어서 서비스 제공이 안정적이라는 장점이 있다.

스케일 아웃(Scale Out)의 장단점 

  • 장점
    • 용량,성능 확장의 한계가 없고 하드웨어를 변경하는것이 아닌 비슷한 성능의 서버를 여러대 두는 방식이기 때문에 지속적으로 확장이 가능하다.
    • 하나의 서버가 트래픽을 담당하는 스케일 업 방식과는 다르게, 여러개의 서버를 둬서 분산 처리하기 때문에 장애 가능성이 감소한다.
    • 스케일 업에 비해서 비용이 저렴하다.
    • 단일 서버에 작업이 쌓여서 멈춰있는 병목현상을 줄일 수 있다.
  • 단점
    • 여러개의 서버를 관리하기 때문에 관리 비용이 증가한다.(라이센스 비용 등)
    • 모든 서버에서 데이터의 일관성을 유지해야하기 때문에 설계 및 관리가 복잡하다.
    • 병렬 컴퓨팅 환경을 구성하고 유지하려면 로드밸런싱에 대해서 깊은 이해가 필요하다.

스케일 업은 데이터 갱신이 빈번하게 일어나는 경우 적합하다.

스케일 아웃은 데이터 변화가 적은 경우 적합하다.(모두 동일한 데이터를 가지고 있어야 하므로)

 

 

상황에 맞게 합리적인 방식을 선택하는 것이 가장 중요하다.

728x90

'Dev > 인프라' 카테고리의 다른 글

[Server] CI/CD  (0) 2021.11.08
[Server] 로드 밸런싱(Load balancing)  (0) 2021.11.05
[AWS] EC2 인스턴스 구축하기  (0) 2021.10.24
[Server]운영 서버에 대한 정리  (0) 2021.10.21
[Server]MSA(MicroService Architecture)란?  (0) 2021.06.18
728x90

데이터베이스 엔진(DataBase Engine) 또는 스토리지 엔진(Storage Engine)은 데이터베이스 관리시스템(DBMS)이 데이터베이스에 대해 데이터를 삽입 ,추출,업데이트 및 삭제하는데 사용하는 기본 소프프웨어 컴포넌트이다.

 

데이터베이스 엔진을 조작할 때 DBMS 고유의 사용자 인터페이스를 이용하는 방법과 포트 번호를 통해 이용하는 방법이 있다.DBMS은 사용자 인터페이스를 통하지 않고, 사용자가 내장된 엔진과 상호작용을 할 수 있는 자신만의 애플리케이션 프로그래밍 인터페이스를 포함하고 있다.

 

MYSQL DB의 스토리지엔진이란 

스토리지엔진은 DB에서 데이터를 어떠한 방식으러 저장하거 접근할 것인지에 대한 기능을 제공한다.스토리지 엔젠의 특성에 따라 데이터 접근이 얼마나 빠른지, 얼마나 안정적인지 , 트랜잭션 등의 기능을 제공하는지 등의 차이점이 발생한다.

 

1.MyIsam

  • 주로 SELECT작업이 많은 경우에 사용하는 MyIsam은 MYSQL의 기본 스토리지 엔진으로 데이터 저장에 실제적인 제한이 없고 매우 효율적으로 저장한다.Full-Text 인덱스를 지원하고 특정 인덱스에 대해 Memory Cache를 지원한다. 트랜잭션은 미지원 / 테이블 레벨의 LOCK을 지원한다. 
  • 잦은 변경 및  삭제에는 좋은 성능이 나오지 못하나 데드락 발생은 예방 가능하다.테이블 작업 시 특정 행을 수정하려고 하면 테이블 전체에 LOCK이 걸려서 다른사람이 작업이 불가능하다.(작업시에는 Table-LOCK이 걸린다.)
  • 트랜잭션에 대한 지원이 없기 떄문에 작업도중 문제가 생겨도 이미 데이터베이스안으로 데이터가 들어간다.

2.InnoDB

  • ACID트랜잭션을 지원하며,  MyISAM보다 데이터 저장비율이 낮고, 데이터 로드 속도가 느리다. 특정 데이터와 인덱스에 대해서 Memory Cache를 지원한다.
  • 데이터 압축이 불가능하고 자동 에러복구 기능이 있고 테이블 레벨이 아닌 ROW레벨의 락을 지원한다.
  • 테이블 작업 시 작업을 시작하면 해당 열만 잠기게 되며 나머지 부분은 다른 사용자가 수정이 가능하다.
  • 쉽게 말하면 LOCK이 작업 시에 Row_Level Lock이 걸리게 된다. 
  • Low_Level이다 보니 insert,delete,update에 대한 속도가 빠르고 주로 데이터 입력 및 수정이 빈번하고 높은 퍼포먼스를 요구하는 대량사이트에 적합하다.

 

3.Cluster

  • 트랜잭션을 지원하고 모든 데이터와 인덱스가 메모리에 존재하여 매우 빠른 데이터 로드 속도를 자랑하며 PK 사용시 최상의 속도를 나타 낸다.

4.Archive

  • MySql 5.0부터 새로 도입된 엔진으로 자동적으로 데이터 압축을 지원하며 다른 엔진에 비해 80프로 저장공간 절약효과가 있고, 가장 빠른 데이터 로드 속도 또한 있지만 Insert와 select만 가능하다.
728x90

'Dev' 카테고리의 다른 글

세션 관리 전략  (0) 2021.10.21
REST API  (0) 2021.10.09
프록시(Proxy)란  (0) 2021.07.26
객체 지향 프로그래밍(OOP)  (0) 2021.06.16
[CS]프로세스(Process)란?  (0) 2021.06.13
728x90

프로젝트 진행 중 컨트롤러의 메서드가 로그인 여부를 확인하는 부가기능을 동시에 처리하는 경우가 존재한다.

이런식으로 반복되는 로직을 AOP,Interceptor,Filter 등을 통해 반복되는 부가기능을 공통적으로 처리할 수 있다.

 

로그인 확인이 필요한 경우

프로젝트를 진행하다가 보면 로그인 없이 접근 가능한 페이지가 있고 로그인을 한 경우에만 접근이 가능한 페이지가 존재한다.

예를들어 마이페이지,비밀번호 변경,상품 등록하기 등이 있다.

 

Interceptor를 적용하기 전 로그인 확인 과정

  • 세션에서 현재 로그인된 사용자의 정보를 꺼내온다.
  • 세션에서 꺼낸 값이 Null이라면 , 해당 사용자는 로그인을 하지 않은 상태이므로 401 UNAUTHORIZED를 반환한다.
  • 만약 정상적으로 session에서 로그인 정보를 꺼낼수 있다면 200 OK 를 반환한다.

controller

1
2
3
4
5
6
7
@GetMapping("/my-info")
    public ResponseEntity<UserInfoDto> myInfo() {
        String currentUser = sessionloginService.getLoginUser();
        UserInfoDto userInfoDto = userService.getUserInfo(currentUser);
        return ResponseEntity.ok(loginUser);
    }
 
cs

 

service

1
2
3
4
5
6
7
public String getLoginUser() {
    String userId = session.getAttribute(USER_ID);
    if(userId == null) {
        throw new UnauthenticatedUserException();
    }
   return userId; 
}
cs

이제 이 과정을 Interceptor를 적용해서 해당 메소드가 자신의 핵심 기능만 집중할 수 있도록 리펙토링 해볼것이다.

 

어노테이션 생성 

 

1
2
3
4
@Retention(RUNTIME)
@Target(METHOD)
public @interface LoginCheck {
}
cs
  • @LoginCheck : 현재 사용자의 로그인 여부를 확인한다.
  • @Retention: 메모리를 어느 시점까지 가져갈지 여부 설정
  • @Target : 해당 어노테이션이 어느 위치까지 사용될지 지정한다.

 

Interceptor 정의

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
@Component
@RequiredArgsConstructor
public class LoginCheckInterceptor implements HandlerInterceptor {
 
    private final SessionLoginService loginService;
 
 
 
    //컨트롤러 메서드 실행되기전
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
                             Object handler) throws Exception {
 
       
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            LoginCheck loginCheck = handlerMethod.getMethodAnnotation(LoginCheck.class);
 
 
            if (loginCheck == null) {
                return true;
            }
 
 
            if (loginService.getLoginUser() == null) {
                throw new UnauthenticatedUserException("로그인 후 이용 가능합니다.");
            }
 
        }
    return true;
 
}
cs

Interceptor는 preHandler() , postHandler() , afterCompletion() 로 구성되어 있다.

  • preHandler() : 컨트롤러 메서드 실행되기전에 실행된다.
  • postHandler() : 컨트롤러 메서드 실행 직후, view가 렌더링 되기전 실행됨
  • afterCompletion() : view 페이지 렌더링 후 실행 

Interceptor는 메서드 실행 직후에 해당 요청을 가로채서 요청을 한 사용자의 로그인 여부를 판단한다.

loginCheck는 해당 Handler에 LoginCheck 어노테이션이 존재하는지 확인한다.

  • loginCheck가 null이라면 로그인 없이 접근 가능한 페이지 이므로 true를 반환한다.
  • loginCheck가 null이 아니라면 session에서 로그인 정보를 꺼내서 null 여부를 판단한다. null이라면 로그인 후 이용 가능하다는 Exception을 날린다.
  • 모든 검증을 통과했다면 로그인이 완료된 상태로 true를 리턴해 다음 작업을 실행한다.

이제 Interceptor를 등록한다.

1
2
3
4
5
6
7
8
9
10
11
12
@Configuration
@RequiredArgsConstructor
public class WebConfig implements WebMvcConfigurer {
 
    private final LoginCheckInterceptor loginCheckInterceptor;
 
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(loginCheckInterceptor);
    }
 
}
cs

 

WebMvcConfigurer는 스프링 부트가 기본적으로 설정한 MVC설정에 추가적으로 기능을 커스터마이징 할 수 있다.(스프링 부트 개발환경에서만 가능)

1
2
3
4
5
6
7
@LoginCheck
@GetMapping("/my-infos")
public ResponseEntity<UserInfoDto> myPage() {
   String currentUser = loginService.getLoginUser();
   UserInfoDto loginUser = userService.getUserInfo(currentUser);
   return ResponseEntity.ok(loginUser);
}
cs

이제 유저의 로그인 여부를 확인하고 사용자의 ID를 가져오는 Service에서 불필요한 예외처리를 할 필요가 없다.

 

728x90

'Dev > Spring' 카테고리의 다른 글

[Spring] JPA+Spring으로 카테고리 로직 구현 - 2  (0) 2021.12.10
[Spring] JPA+Spring으로 카테고리 로직 구현 - 1  (0) 2021.12.10
[Spring] AOP(Aspect Oriented Programming)  (0) 2021.09.10
ResponseEntity  (0) 2021.08.25
@Transactional  (1) 2021.08.24
728x90

➡️트랜잭션

  • 트랜잭션은 DBMS가 데이터베이스를 다룰 때 사용하는 작업의 단위이다.
  • 트랜잭션은 데이터베이스의 무결성을 유지하기 위해 원자성, 고립성, 지속성의 성질을 갖는다.DBMS는 트랜잭션이 이러한 성질을 유지할 수 있도록 지원한다.
  • 데이터베이스에서 데이터를 다룰 때  장애가 일어나는경우에 데이터를 복구하는 작업의 단위가 된다.
  • 데이터베이스에서 여러 작업이 동시에 같은 데이터를 다룰 때 서로 분리하는 단위가 된다.

➡️트랜잭션의 수행 과정

 

아래와 같은 트랜잭션의 수행 과정은 2가지 방법으로 나눠진다.

방법 1 : 1 - 2 - 3 - 4 - Commit - 5 - 6 

방법 2 : 1 - 2 - 3 - 4 - 5 - 6 - Commit

+@Commit은 트랜잭션의 수행이 완료가 된것을 트랜잭션 관리자에게 알려주는 연산이다.Commit을 사용하는 이유는 DBMS가 일괄적으로 하드디스크에 접근하여 처리함으로써 개별 접근하는 것을 피하고  사용자에게 빠른 응답성을 보장하기 위해서 이다.

이 두가지 방법중에서 DBMS는 클라이언트에세 빠른 응답성을 보장하기 위해 방법 1을 선택한다.

이유는 수행결과를 데이터베이스에 기록하는 5,6의 과정이 시간이 많이 소요되고,다른 트랜잭션이 또 사용중인 테이블이 필요할 수 있기 때문이다.즉 트랜잭션은 임시로 종료선언하고 실제 데이터 베이스에 기록하는 것은 DBMS가 수행한다.

  1. 1.A계좌의 값을 하드디스크(데이터베이스)에서 주기억장치 버퍼로 읽어온다.
  2. B계좌의 값을 하드디스크(데이터베이스)에서 주기억장치 버퍼로 읽어온다.
  3. A 계좌에서 10000원을 인출한 값을 저장한다
  4. B 계좌에서 10000원을 입금한 값을 저장한다.
  5. A 계좌의 값을 주기억장치 버퍼에서 하드디스크(데이터베이스)에 기록한다.
  6. B 계좌의 값을 주기억장치 버퍼에서 하드디스크(데이터베이스)에 기록한다.

 

 

➡️트랜잭션 성질(ACID 성질)

  • 원자성(Atomicity)
    • 트랜잭션에 포함된 작업은 전부 수행되거나 전부 수행되지 않아야 한다.
    • 트랜잭션이 중간에 끊기면 이후에 해당 트랜잭션의 어디서부터 이어 수행해야되어야 하는지 모르기 때문에 작업이 잘못되면 회복 알고리즘을 이용하여 변경한 내용을 취소한다.
  • 일관성(Consistency)
    • 트랜잭션을 수행하기 전이나 후나 데이터베이스는 항상 일관된 상태를 유지해야 한다.
  • 고립성(Isolation)
    • 수행 중인 트랜잭션에 다른 트랜잭션이 끼어들어 변경중인 데이터 값을 훼손하지 않아야한다.
    • 고립성을 유지하기 위해서는 여러 트랜잭션이 동시에 접근하는 데이터에 대한 제어가 필요하다.
  • 지속성(Durability)
    • 수행을 성공적으로 완료한 트랜잭션은 변경한 데이터를 영구히 저장해야 한다.
    • 트랜잭션의 성공 결과 값은 장애발생 후에도 변함없이 보관되어야 한다는 것으로 트랜잭션이 정상적으로 완료(Commit)된 경우에는 버퍼의 내용을 하드디스크에 확실히 기록하여야 하며, 부분 완료(Partial Commit)된 경우에는 작업을 취소(Aborted)하여야  한다.

 

➡️트랜잭션과 DBMS

  • DBMS는 원자성을 유지하기 위해 회복관리자 프로그램을 작동시킨다.회복 관리자 프로그램은 데이터베이스가 변경한 내용을 로그로 기록하고 있다가 트랜잭션에 문제가 생겼을 때 원래 상태로 되돌린다.
  • DBMS는 일관성을 유지하기 위해 무결성 제약조건을 활용한다.트랜잭션 수행 시 데이터에 변경이 가해지면 미리 정의해 둔 무결성 제약조건을 검사하여 일관성이 깨지는 것을 막는다.
  • DBMS는 고립성을 유지하기 위해 일관성을 유지하는 것과 마찬가지로 동시성 제어 알고리즘을 작동시킨다.동시성 제어 알고리즘을 작동시켜 여러 트랜잭션이 동시에 같은데이터를 접근할 때 마치 한 트랜잭션씩 순서대로 접근하는 것처럼 제어한다.
  • DBMS는 지속성을 유지하지 위해 회복관리자 프로그램을 이용한다. 회복관리자 프로그램은 데이터베이스가 변경한 내용을 로그로 기록하고 있다가 트랜잭션에 문제가 있을 때 원래 상태로 되돌린다.

 


Reference

  • Mysql로 배우는 데이터베이스 개론과 실습 

 

 

 

 

  •  

 

728x90
728x90

👉이상현상(Anomly)

  • 삭제 이상 : 튜플 삭제 시 같이 저장된 다른 정보까지 연쇄적으로 삭제되는 현상이다.
  • 삽입 이상 : 튜플 삽입 시 특정 속성에 해당하는 값어 Null값을 입력해야 하는 현상이다.
  • 수정 이상 : 튜플 수정 시 중복된 데이터의 일부만 수정되어 일어나는 데이터 불일치 현상이다.

아래 사진에서 장미란이라는 학생 정보를 지울결루 강의실 103도 같이 사라진다.이 현상이 삭제 이상이다.

박지성 학생과 김연아 학생 같은 수업을  110호에서 수강을 한다. 그런데 두 강의는 독립적으로 입력된 데이터이기 때문에 박지성 학생에서 강의실을 201호로 변경하여도 김연아 학생은 110호로 데이터가 그대로 유지되고, 같은 데이터베이스 수업임에도 불구하고 강의실이 달라지는 현상이 발생한다.이 현상이 수정 이상이다.

이러한 이상현상은 튜플에 독립적으로 존재하기 때문에 발생한다. 그러므로 테이블을 분리하여 강의실을 참고하게끔 하면 이상 현상을 해결할 수 있다.


👉함수 종속성(Functional Dependency)

  • 데이터베이스의 릴레이션에서 두 개의 애트리뷰트 집합 간 제약의 일종이다.
  • 어떤 릴레이션 R에서 X와 Y를 각각 R의 애트리뷰트 집합의 부분 집합이라고 하면, 애트리뷰트 X의 값 각각에 대해 시간에 관계없이 항상 애트리뷰트 Y값이 오직 하나만 연관되어 있을 때 Y는 X에 함수 종속이라고 한다.
  • 튜플이 주어지고 ,X 애트리뷰트의 값이 주어지면 ,Y 애트리뷰트의 값을 구할 수 있다.X와 Y가 릴레이션 R의 애트리뷰트집합의 부분 집합이면,X->Y라는 표기는, X가 각각의 Y멤버를 함수적으로 결정한다는 뜻이다.
  • 정리하면 속성 A의 값을 알면 다른 속성 B의 값이 유일하게 정해지는 의존관계이다.
  • EX)학번 -> 학생 , 강좌이름 -> 강의실 

👉함수 종속 다이어 그램

  • 릴레이션 간의 속성 : 직사각형 
  • 속성 간의 함수 종속성 : 화살표 
  • 복합 속성 : 직사각형으로 묶어서 표기 


Reference

728x90

'Dev > Database' 카테고리의 다른 글

[MYSQL]효율적인 트래픽 분산을 위한 Master/Slave 동적 라우팅  (0) 2021.10.24
[DB]트랜잭션(transaction)  (0) 2021.09.14
[DB] 정규화(Normalization)  (0) 2021.09.11
[MYSQL]SQL_1  (0) 2021.08.21
Redis란?  (1) 2021.08.16
728x90

📁정규화(Normalization)

정규화는 테이블 간에 중복을 허용하지 않는다는 목표를 가지고 있다. 중복된 데이터를 허용하지 않으므로써 무결성을 유지할 수 있고, 데이터 베이스 용량 또한 줄일수 있다.

테이블이 어떻게 분리되는지에 따라 정규형 단계가 달라진다.

📁제 1 정규형

  • 제 1 정규형은 릴레이션의 모든 속성 값이 원자값을 가지는 경우이다.
  • 아래 그림처럼 추신수 선수의 취미가 (영화,음악)으로 원자값이 아니다.속성 값이 원자 값이 아닐 경우 원자 값을 갖도록 변환 해주어야한다.
  • 고객취미들(이름,취미들) 릴레이션을 고객취미(이름,취미)릴레이션으로 바꾸어 저장하면 제 1 정규형에 만족한다.

📁제 2 정규형 

  • 제 2 정규형은 릴레이션이 제 1 정규형을 만족하고, 기본키가 아닌 속성이 키본키에 완전 함수 종속일 때를 의미한다.
  • 완전 함수 종속은 A와 B가 릴레이션 R속성이고 A -> B 종속성이 성립할 때,B가 A의 속성 전체에 함수 종속하고 부분 집합 속성에 함수 종속하지 않을 경우 완전 함수 종속이다.
  • 반면 A->B 종속성에서 A의 속성 일부를 제거해도 종속성이 여전히 성립하는 경우 불완전 함수 종속이다. 예를 들어(A1,A2) -> B 종속성에서 A2를 제거했는데도 A1 -> B 가 여전히 성립한다면 불완전 함수 종속이다.

위 사진에서 (학생번호,강좌이름)의 복합키를 가지고 가정을 하면 (학생번호,강좌이름)이 모여서 성적이라는 값을 결정하지만, 강의실의 경우 강좌이름이 없어도 강의실을 결정할 수 있다. 그러므로 이러한 관계를 부분 함수 종속이라고 하고 제2정규형은 완전 함수 종속을 만족 시켜야 하므로 강좌이름과 강의실을 분리하면 제 2 정규형이 성립된다.

 

📁제 3 정규형

  • 제 3 정규형은 릴레이션 R이 제 2 정규형을 만족하고 기본키가 아닌 속성이 기본키에 비이행적으로 종속할 때를 의미한다.
  • 이행적 종속이란 A->B,B->C 가 성립할 때  A->C가 성립되는 함수의 종속성을 의미한다.

아래 그림을 보면 학생번호의 강좌이름이 변경되면 수강료도 변경되어야 한다.속성들을 독립적으로 만드는 것이 아니라 학생 번호로 학생이 수강하는 강좌이름을 찾게 하고 그 학생번호가 참조하는 강좌이름을 참조하여 수강료를 찾게하여 학생 번호로 수강료를 참조할 수 있게 만들면 제 3 정규형이 성립된다.

📁BCNF  정규형

  • BCNF 정규형은 릴레이션 R에서 함수 종속성 X-> Y가 성립할 때 모든 결정자 X가 후보키인 정규형이다.

그림에서 기본키는(학생번호, 특강이름) 이고 교수는 (학생번호, 특강이름)에 완전하게 함수적으로 종속하고 있고 교수 역시도 특강 이름을 결정하며 결정자의 역할을 하고 있다. 다음은 모든 결정자 X가 후보키인지를 확인해야 합니다. (학생번호, 특강이름)은 기본키이므로 당연히 결정자이며 후보키이다. 하지만 교수는 결정자이면서 후보키가 아니므로 아래의 왼쪽 테이블은 BCNF정규형이 아닙니다. BCNF정규형을 만족하기 위해서 왼쪽의 테이블을 오른쪽과 같이 분리해야 한다.

 

📁무손실 분해(Loseless-join decomposition)

이상현상을 해결하기 위해서 릴레이션을 분해해야 한다. 하지만 릴레이션 R을 분해할 때 분해 후의 결과와 달라지만 문제가 발생하므로 우리는 손실 없이 릴레이션을 분해 해야한다. 릴레이션 R을 R1과 R2로 분해할 때 , R1> <R2을 만족하는 경우 무손실분해라고한다.

 

 


REFERENCE

-MYSQL로 배우는 데이터 베이스 개론과 실습 

728x90

'Dev > Database' 카테고리의 다른 글

[DB]트랜잭션(transaction)  (0) 2021.09.14
[DB]이상현상(Anomly), 함수 종속성 (Functional Dependency)  (0) 2021.09.13
[MYSQL]SQL_1  (0) 2021.08.21
Redis란?  (1) 2021.08.16
데이터 베이스 시스템 개념  (0) 2021.07.20
728x90

📖 AOP(Aspect Oriented Programming)

개발을 하다보면 공통적인 기능이 많이 발생한다. 이러한 공통 기능을 모든 모듈에 적용하기 위해 상속을 하지만 자바에서는 다중상속이 불가능해서 상속을 받아 공통 기능을 부여하기에는 한계가 있다.

AOP를 사용하지 않는다면 중복 코드가 발생할 소지가 있고, 코드의 변경이 필요하면 여러코드에 종속적으로 변경이 필요하고 핵심 비즈니스 로직에 호출 시간 측정이라는 부수적인 로직이 추가되어 가독성과 효율성이 떨어지는 문제가 발생한다.

이러한 문제점을 해결하기 이해서는 AOP가 필요하다.AOP는 새로운 프로그래밍 패러다임이 아니라 객체 지향 프로그래밍(OOP)를 돕는 보조적인 기술로, 핵심적인 관심사항과 공통 관심사항으로 분리 시키고 각각을 모듈화 하는 것이다.

 

📖AOP(Aspect Oriented Programming)의 주요 개념

  • Aspect : 흩어진 관심사를 모듈화 한 것이다. 주로 부가기능을 모듈화한다.
  • Target : Aspect를 적용하는곳 
  • Advice : 실질적인 부가기능을 담은 구현체
  • JoinPoint : Advice가 적용될 위치, 끼어들 수 있는 지점. 메서드 진입 지점, 생성자 호출 시점,필드에서 값을 꺼내올 때 등 다양한 시점에 적용가능
  • PointCut : JoinPoint의 상세한 스팩을 정의한 것.

 

📖AOP(Aspect Oriented Programming)의 장점 

  • 공통 관심 사항을 핵심 관심사항으로부터 분리시켜 핵심 로직을 깔끔하게 유지할 수 있다.
  • 가독성과 유지보수성을 높일 수 있다.
  • 각각의 모듈에 수정이 필요하면 다른 모듈의 수정 없이 해당 로직만 변경하면 된다.
  • 공통 로직을 적용할 대상을 선택할 수 있다.

📖AOP(Aspect Oriented Programming)특징

 

  • 프록시 패턴 기반의 AOP 구현체, 프록시 객체를 쓰는 이유는 접근 제어 및 부가기능을 추가하기 위해서이다.
  • 스프링 빈에만 AOP를 적용 가능하다.
  • 모든 AOP 기능을 제공하는 것이 아닌 스프링 IoC와 연동하여 엔터프라이즈 애플리케이션에서 가장 흔한 문제에 대한 해결책을 지원하는 것이 목적



📖AOP 기본적인 실습

특정 어노테이션이 붙은 포인트에 해당 Aspect를 실행할 수 있는 기능도 제공한다. 

 

@Around 어노테이션은 타겟 메서드를 감싸서 특정 Advice를 실행한다는 의미이다. 

@Aspect 어노테이션을 붙여 이 클래스가 Aspect를 나타내는 클래스라는 것을 명시하고 @Component를 붙여 스프링 빈으로 등록한다.

 

@Target은 어노테이션이 적용될 레벨을 의미한다. 

 

@Retention 어노테이션으로 어느 시점까지 어노테이션의 메모리를 가져갈 지 설정하고, @Target 어노테이션으로 필드, 메소드, 클래스, 파라미터 등 선언할 수 있는 타입을 설정하면 대부분 커스텀 어노테이션은 쉽게 생성할 수 있다. 

 

결과 @ExecutionTimeChecker 를 붙인 메서드에 Aspect가 추가된것을 알 수 있다.

 

😸GITHUB 소스코드 : https://github.com/ryudongjae/blog-ex

 

GitHub - ryudongjae/blog-ex

Contribute to ryudongjae/blog-ex development by creating an account on GitHub.

github.com


 

REFERENCE

728x90

'Dev > Spring' 카테고리의 다른 글

[Spring] JPA+Spring으로 카테고리 로직 구현 - 1  (0) 2021.12.10
[Spring] 어노테이션으로 로그인 여부 확인(Interceptor)  (0) 2021.09.21
ResponseEntity  (0) 2021.08.25
@Transactional  (1) 2021.08.24
Spring REST Docs  (0) 2021.08.23