가장 기본적이면서, 당연히 알 것 같지만 사실 너무 기본적이기 때문에 쉽게 잊고 넘어갈 수 있는 개념이라고 생각하는 주제이다.

 

면접 볼 당시에 개발을 모르는 사람에게 클래스에 대한 설명을 해준다면 어떤식으로 해줄 수 있을까 라는 질문에 제대로 답을 못했던 기억이 있다.

클래스
객체 지향 프로그래밍 (OOP)에서 특정 객체를 생성하기 위해 변수와 메소드를 정의하는 일종의 틀(template)이다. 객체를 정의하기 위한 메소드와 변수로 구성된다.
- 위키

예시로 가장 많이 쓰이는 것이 자동차이다.

자동차라는 클래스 안에는

핸들, 액셀, 브레이크 패달 등의 눈으로 볼 수 있는 부품들은 '변수'로서 정의 할 수 있고, 

"브레이크 패달을 밟는다", "스타트 버튼을 누른다" 등의 행동에 대해서 "자동차의 속도가 줄어 멈춘다", "엔진을 점화 시켜 동작하게 만든다" 처럼 기능을 정의하는 메소드로 구분할 수 있다.

 

정리하자면 클래스란? 

우리 주변에 있는 모든 사물을 코드로서 변환 하는 것 이라고 생각한다.

 

'학습 > 이론' 카테고리의 다른 글

인덱스(INDEX)  (0) 2023.04.05
스토어드 프로시저  (0) 2023.04.05
PK와 FK  (0) 2023.04.04
쿠키와 세션  (0) 2023.04.04
JWT  (0) 2023.04.04

PK와 FK와 마찬가지로 index 또한 막연하게 사용하면 쿼리 속도가 빨라진다 라는 생각만 가지고 있던 내용이기 때문에 index란 무엇인지 알아보려고 한다.

INDEX란?
RDBMS에서 검색 속도를 높이기 위한 데이터베이스 객체입니다.
INDEX는 색인입니다. 특정 TABLE의 칼럼을 색인화 하여 검색할 때 TABLE의 레코드를 전부 다 확인하는 것이 아니라
색인화 되어있는 INDEX파일을 검색하여 검색 속도를 빠르게 합니다.
INDEX 사용 이유는?
데이터 저장 영역에서는 인덱스가 없는 테이블의 데이터를 찾을 때 무조건 전체 데이터 베이스를 처음부터 끝까지 다 읽어서 검색조건에 맞게 찾게됩니다. 이런 식의 검색 방법을 Full Scan이라고 하는데, 양이 엄청나게 많은 테이블에서 데이터를 불러올 때 Full Scan을 하게 되면 처리 성능이 떨어집니다. 
고로 Index는 데이터를 검색할 때 빠르게 찾기 위해 사용된다.
장점
  • 무조건은 아니지만 검색 속도를 향상할 수 있습니다.
    - 인덱스를 생성 시에는 where절과 join, order by 등과 관련된 칼럼 중 사용빈도가 높고 키값의 선별도가 좋은 칼럼에 사용해야 합니다. 반대로 사용빈도가 낮고 칼럼의 선별도가 좋지 않은 (값이 True /False 같은 것들) 칼럼의 경우에는 인덱스를 사용하지 않는 것이 좋습니다
    - 테이블이 작거나 자주 갱신이 필요한 칼럼들에도 사용하지 않는 것이 좋습니다.

 

단점
  • DB의 10% 정도의 공간이 요구됩니다.
  • 인덱스를 생성하는 시간이 크게 요구됩니다.
  • DB의 변경 작업이 잦으면 성능이 저하됩니다.

출처 : https://runcoding.tistory.com/33

 

 

 

 

'학습 > 이론' 카테고리의 다른 글

Class란?  (0) 2023.05.21
스토어드 프로시저  (0) 2023.04.05
PK와 FK  (0) 2023.04.04
쿠키와 세션  (0) 2023.04.04
JWT  (0) 2023.04.04

MSSQL을 사용함에 있어 중요한 Stored Procedure를 왜 사용하는 것이고, 어떠한 장단점이 있는지 알아보려고 한다.

스토어드 프로시저란?
쿼리를 함수처럼 실행하기  위한 쿼리의 집합

스토어드 프로시져는 저장 프로시저라는 뜻을 가지고 있다.

DB에 있는 데이터를 조회하기 위해서는 짧은 쿼리문 뿐만 아니라 100줄이 넘어가는 긴 쿼리를 작성해야 하는 경우가 생기는데, 

작성된 쿼리문을 프로시저에 저장, 필요할 때에 프로시저를 호출 하여 효율적으로 프로그래밍 하기 위해 사용된다.

또한 IF문이나 반복문을 사용하여 프로시저를 호출 할 수 있는 것도 큰 장점이라고 생각된다.

 

*알고보니 프로시저는 MSSQL뿐만 아니라 MySQL에서도 사용이 되고 있었다.

 

 

장점
  •  하나의 요청으로 여러 SQL문을 실행 할 수 있다.
    - 하나의 sp안에 IF문과 반복문을 사용하여 여러 형태의 쿼리문을 작성한다.
  • 네트워크 소요 시간을 줄일 수 있다.
    - 동일한 쿼리를 1000번 2000번 호출하는 것보다 SP를 이용해서 구현한다면 SP를 호출할 때 한 번만 네트워크를 경유하기 때문에  네트워크 소요시간을 줄이고 성능을 개선할 수 있다.
  • 개발 업무를 구분해 개발 할 수 있습니다.
    - 순수한 애플리케이션만 개발하는 조직과 DBMS 관련 코드를 개발하는 조직이 따로 있다면, DBMS 개발하는 조직에서는 데이터베이스 관련 처리하는 SP를 만들어 API처럼 제공하고 애플리케이션 개발자는 SP를 호출해서 사용하는 형식으로 역할을 구분하여 개발이 가능
단점
  • 처리 성능이 낮다.
    - 문자나 숫자 연산에 저장 프로시저를 사용한다면 오히려 C나 JAVA보다 성능이 느리다.
  • 디버깅이 어렵다.
    - 너무 공감하는 부분이다.. 실제 프로시저를 작성하여 개발하면서 어떤 부분에 오류가 나고 있는지 자세하게 알려주지 않기 때문에, 프로시저 자체를 호출하면서 중간중간 실행되고 있는 결과를 찍어보면서 디버깅을 해야한다.(php처럼 디버깅 해야했던 기억이 난다)
  • DB 확장이 매우 힘들다.
    - 서비스 사용자가 많아져 서버수를 늘려야할 때, DB 수를 늘리는 것이 더 어렵다.
    • 서비스 확장을 위해 서버수를 늘릴경우 DB 수를 늘리는 것보다 WAS의 수를 늘리는 것이 더 효율적이기 때문에 대부분의 개발에서 DB에는 최소의 부담만 주고 대부분의 로직은 WAS에서 처리할 수 있게 합니다.
      (아마도 api를 호출하는 서버를 분할하여 늘리는 것을 얘기하는 것 같다..)

출처 : https://runcoding.tistory.com/31

'학습 > 이론' 카테고리의 다른 글

Class란?  (0) 2023.05.21
인덱스(INDEX)  (0) 2023.04.05
PK와 FK  (0) 2023.04.04
쿠키와 세션  (0) 2023.04.04
JWT  (0) 2023.04.04

데이터베이스를 다루면 가장 기본적으로 pk와 fk에 대해서 '당연하게 사용해야 하는 것' 이라는 것만 알고 있지 어떤 의미이며 왜 사용해야 하는지에 대해서 모르고 있었기 때문에 정리를 하려 한다.

 

 

KEY란?

데이터베이스에서 조건에 만족하는 튜플을 찾거나 순서대로 정렬할 때 튜플들을 서로 구분할 수 있는 기준이 되는 어트리뷰트를 말한다.

즉 테이블에서 데이터를 구분하여 쉽게 찾기 위해 설정 하는 것 이라는 의미로 생각 된다.

 

1. PK

1. 기본키는 후보키 중에서 선택한 주키(Main Key)이다.

2. 한 릴레이션(테이블인것 같다)에서 특정 튜플을 유일하게 구별할 수 있는 속성이다.

3. Null값을 가질 수 없다.

4. 기본키로 정의된 속성에는 동일한 값이 중복되어 저장될 수 없다.

(중복되지 않고 유일하게 구별 가능한 속성)

 

 

후보키란?
릴레이션을 구성하는 속성들 중에서 튜플을 유일하게 식별하기 위해 사용하는 속성들의 부분집합, 즉 기본키로 사용할 수 있는 속성들을 말한다.
하나의 릴레이션내에서는 중복된 튜플들이 있을 수 없으므로 모든 릴레이션에는 반드시 하나 이상의 후보키가 존재한다.
후보키는 릴레이션에 있는 모든 튜플에 대해서 유일성과 최소성을 만족시켜야 한다.

유일성 : 하나의 키값으로 하나의 튜플만을 유일하게 식별할 수 있어야한다.
최소성 : 모든 레코드들을 유일하게 식별하는데 꼭 필요한 속성만으로 구성되어 있어야한다.

2.  FK

1. 관계를 맺고 있는 릴레이션 R1,R2에서 릴레이션 R1이 참조하고 있는 릴레이션 R2의 기본키와 같은 R1 릴레이션의 속성을 외래키라고 한다.

2. 외래키는 참조되는 릴레이션의 기본키와 대응되어 릴레이션 간에 참조관계를 표현하는데 중요한 도구이다.

(어떤 릴레이션의 기본 키를 참조하는 애트리뷰트)

-출처 : https://coding-factory.tistory.com/220

 

 

FK의 사용 이유
foreign key를 사용하는 이유는 참조 무결성을 위해서이다. 연관관계에 있는 테이블에서, 외래키로 지정된 컬럼 데이터가 부모의 기본키 외 다른 값을 가질 수 없게 하여 외래키 컬럼에 저장될 수 있는 데이터를 제어하게 된다.
예를 들어, 유저, 주문 테이블이 있고 주문 테이블에 foreign key로 유저의 primary key를 갖고 있다 하면, 아직 가입 안된 유저 id로 주문테이블에 데이터를 넣으려하면 에러를 발생시켜 해당 데이터 삽입을 막는다. 이를 통해 주문 테이블 내에서 참조하는 값이 존재한다는 것을 보장할 수 있다. 즉 참조하는 테이블의 무결성을 높여주게 된다.

 

실무에서 FK를 사용 안하는 이유

DB설계를 할 때에 FK를 미리 설정 할 수 있다. 그치만 실제 테이블을 생성할 때에는 FK를 설정하지 않고 PK만 설정하고 테이블을 생성하는 경우가 많았다.

관리포인트 증가

  • 테스트 등 진행시에 부모 row없이 자식 테이블 테스트만 하는 것이 불가능하다.
  • 트랜잭션 안에서 부모-자식 테이블 관계에 따라 작업 순서가 필요하다.
  • 규모가 증가함에 따라 데이터베이스의 설계도 조금씩 달라지는데 이 경우 참조무결성으로 인해 더 큰 수정개발을 불러 일으킬 수도 있다.
  • 실수로 데이터 변경하거나 지웠는데 연관관계에 있는 다른 테이블에까지 영향이 미치게 된다.

출처 : https://velog.io/@destiny1616/Foreign-Key-07mrx6w4

 

실제 신규 개발 프로젝트에 참여 했을 때에는 테이블을 생성하더라도 해당 테이블이 값이 고정이 된 경우가 드물었다. 기획은 계속 변화하고,  여러 기능과 정보를 담기 위해서는 테이블의 컬럼값들을 변화시켜야 했기 때문에 그 이유로 FK를 지정하지 않고 개발을 했었다.

실제 하던 프로젝트가 중단되어서 개발이 더이상 진행 되지 못하는 상황이었기 때문에 이후 작업을 하지 못한점이 아쉽다.


조인

조인이란?

- 테이블 결합이라는 뜻

 

조인의 사용 이유

- 테이블을 결합해야 필요한 정보를 얻을 수 있기 때문

 (*한 테이블에 정보를 몰아서 담아두면 데이터의 중복이 생겨나기 때문에 해당 현상을 방지 하기 위하여 테이블을 분할 하여 정보를 저장한다.)

'학습 > 이론' 카테고리의 다른 글

Class란?  (0) 2023.05.21
인덱스(INDEX)  (0) 2023.04.05
스토어드 프로시저  (0) 2023.04.05
쿠키와 세션  (0) 2023.04.04
JWT  (0) 2023.04.04

2023.04.04 - [이론] - JWT

 

JWT

나는 개발자로 젼향 하면서 정해진 기한 안에 결과물을 만드는데에만 급급했었다.. (매번 쫓기듯 업무를 진행했었기 때문일지도 모름..😥) 요새 면접을 보러 다니면 이론적인 부분에 대해서 전

mongkey3109.tistory.com

앞서 알아봤던 jwt에서 언급 되었던 session이란 무엇인지와 session과 함께 비교되는 cookie에 대해서 알아보려고 한다. 


쿠키란?

출처 : https://code-lab1.tistory.com/298

 

- 쿠키는 클라이언트(로컬)에 저장되는 키와 값이 들어있는 작은 데이터 파일이다.

- 쿠키는 클라이언트에 저장되어 필요시 정보를 참조하거나 재사용할 수 있다.

- 보통 웹 환경에서는 클라이언트와 서버가 HTTP 프로토콜을 이용해 통신한다. 

 

 

특징 

1. 비연결성

HTTP는 TCP 연결을 맺고 요청(Request)을 보내면 서버는 응답(Response)을 보내고 연결이 끊어진다.

물론 HTTP 1.1 버전은 커넥션을 계속 유지하는 keep-alive 옵션이 디폴트이긴 하다. 

하지만 HTTP 1.0 버전은 기본적으로 connectionless이다.

 

2. 무상태

HTTP는 상태를 따로 저장하지 않는다. 즉, 연결이 끊어지는 순간 모든 상태 정보가 사라지게 된다.

따라서 서버는 클라이언트가 첫 번째 통신 때 보낸 정보를 두 번째 통신 때 알 수 없다.

 

위와 같은 HTTP의 특성 때문에 쿠키가 사용된다.

 

쿠키의  구성

  • 이름 : 쿠키를 구별하는 이름
  • 값 : 쿠키에 저장되는 값
  • 유효시간 : 큐키 유지시간
  • 도메인 : 쿠키를 전송할 도메인
  • 경로 : 쿠키를 전송할 요청 경로

1. 클라이언트(웹 브라우저)가 서버에 로그인을 요청

- 서버는 클라이언트의 요청을 받고 클라이언트의 정보를 담은 쿠키를 생성한다.

- 이후 HTTP 헤더에 set-cookie 옵션을 통해 쿠키를 포함해 응답을 보낸다.

- 클라이언트는 해당 쿠키를 쿠키 저장소에 저장해 놓는다.

 

2. 클라이언트가 로그인을 완료하고 첫 페이지인 welcome 페이지에 접근

- 클라이언트는 쿠키 저장소에서 쿠키를 꺼내 HTTP 요청에 쿠키를 담아 전송

- 서버는 HTTP 요청의 쿠키를 읽어 클라이언트를 식별한다.


Session이란?

Session은 영구적이고 상호작용적인 정보 교환을 전제하는 둘 이상의 통신 장치나 컴퓨터와 사용자 간의 대화나 송수신 연결상태를 의미하는 보안적인 다이얼로그(dialogue) 및 시간대를 가리킨다.

- 위키 백과 -

 

* 클라이언트와 서버의 연결 상태를 말하는 것

 

쉽게 설명하면 사용자가 웹사이트에 접속해 해당 창을 닫기 전까지의 상태라고 보면 된다.

 

특징

  • Browser마다 개별 저장소(Session객체)를 서버에서 제공(발급)한다.
  •  클라이언트에게 고유한 ID를 부여한다.
  • 웹서버에 컨테이너 상태를 유지하기 위한 정보를 저장한다.
  • 세션 ID로 클라이언트를 구분하여 클라이언트 요구에 맞는 서비스를 제공한다.
  • 사용했던 정보들을 서버에 저장하기 때문에 쿠키보다 보안성이 더 우수하다.
  • 서버에 저장되기때문에 서버 부하가 발생한다.
  • Http 프로토콜은 비접속형 프로토콜이라서 매 접속마다 새로운 네트워크 연결이 이뤄지는데, 세션이 연결 유지를 가능하게 해준다.
  • Session은 쿠키를 기반으로 한다.

 

1. 클라이언트(웹 브라우저)가 서버에 로그인을 요청

- 서버는 클라이언트의 요청을 받고 클라이언트의 정보를 담은 세션을 생성한다.

- 세션 ID를 담은 쿠키를 생성하고, HTTP 헤더에 set-cookie 옵션을 통해 쿠키를 포함한 응답을 보낸다.

- 클라이언트는 해당 쿠키를 쿠키 저장소에 저장해 놓는다.

 

2. 클라이언트가 로그인을 완료하고 첫 페이지인 welcome 페이지에 접근

- 클라이언트는 쿠키 저장소에서 쿠키를 꺼내 HTTP 요청에 쿠키를 담아 전송

- 서버는 HTTP 요청의 쿠키를 읽어 쿠키 안의 세션 ID를 이용해 클라이언트를 식별


쿠키와 세션의 차이

  • 쿠키는 클라이언트에 저장되지만, 세션은 서버에 저장된다.
  • 세션은 서버에 저장되므로 서버의 자원을 사용한다.
  • 쿠키는 클라이언트에 저장되므로 서버의 자원을 사용하지 않는다는 이점이 있다.
  • 서버에 요청을 보내는 사용자가 많을 경우 세션은 부하가 심할 수 있다.
  • 보안면에서 세션이 더 우수하다. 쿠키는 정보를 직접 저장하고 요청을 보낼 수 있다. 만약 쿠키에 사용자의 주민번호 같은 민감한 정보를 그대로 담아 HTTP 요청을 보낸다고 하자. 이때 중간에 정보를 스니핑 당할 수도 있다.
  • 세션은 쿠키를 이용해 쿠키에 세션 ID만 저장하고 서버에서 세션을 처리하기 때문에 비교적 보안성이 좋다.
  • 쿠키는 만료시간 동안 파일로 저장되므로 브라우저를 종료해도 정보가 남아있다.
  • 세션은 브라우저가 종료되면 만료시간에 상관없이 삭제된다.

'학습 > 이론' 카테고리의 다른 글

Class란?  (0) 2023.05.21
인덱스(INDEX)  (0) 2023.04.05
스토어드 프로시저  (0) 2023.04.05
PK와 FK  (0) 2023.04.04
JWT  (0) 2023.04.04

나는 개발자로 젼향 하면서 정해진 기한 안에 결과물을 만드는데에만 급급했었다.. 

(매번 쫓기듯 업무를 진행했었기 때문일지도 모름..😥)

 

요새 면접을 보러 다니면 이론적인 부분에 대해서 전혀 대답을 못하고 있는 내가 너무 작게 느껴졌다.. 그래서 지금까지 내가 해왔었던 기술들이 어떤 의미에서 어떻게 사용하는것이 올바른지에 대해서 이론적으로 정리를 해보려 한다.

 

그 첫번째 JWT를 적어보려고 한다. 

https://blog.naver.com/seek316/222410946965
https://velog.io/@syoung125/JWT-%ED%86%A0%ED%81%B0%EC%9D%B4%EB%9E%80

위 게시글을 참고하여 정리해 보려 한다. 

 

우선 JWT를 사용하기 위한 이유를 알아보았다.

 

어떠한 사이트에 들어가서 물흐르듯 자연스럽게 회원가입과 로그인의 행위를 하는데,

 

로그인의 행위는 인증 이라고 한다.

인증은 특정 서비스에 어떠한 권한이 주어진 사용자임을 확인 받는 것이라 한다.

 

이후 사용자가 한번 인증을 받은 후 그 사용자가 특정 리소스에 액세스(특정 기능을 사용) 할 수 있는지 여부를 결정하는 프로세스를 인가 라고 한다.

 

인가의 필요성은 크게 두가지로 분류 되는데

1. 로그인의 행위

 - 로그인은 DB에 저장된 사용자 계정의 정보를 조회한 후 사용자의 암호를 복잡한 알고리즘으로 계산한 값과 일치하는지 확인 하는 과정이 무거운 작업이기 때문

2. 보안의 이유

 - 매 요청마다 아이디와 패스워드가 전송되는 것이 보안상 위험하기 때문

이다.


 

JWT (JSON Web Token)

암호화된 3가지 데이터를 이어붙인 형태(aaa.bbb.ccc)로 구성되어 있다.

 

  • JWT Token 예: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

1. HEADER

 - 토큰의 타입과 해시 암호와 알고리즘으로 구성되어있다.

▶ alg 는 HMAC, SHA256, RSA와 같은 해시 알고리즘을 나타내는 부분

▶ typ는 토큰의 유형

 

2.PAYLOAD

- 토큰에서 사용할 정보의 조각들 [클레임(Claim)]이 담겨져 있다.

 

클레임의 종류는 크게 3가지로 구성되어있다.

 

① 등록된 클레임

▶ iss : 토큰 발급자

▶ sub : 토큰 제목

▶ aud : 토큰 대상자

▶ exp : 토큰 만료 시간 [ NumericDate 형식으로 되어 있어야 한다. ex) 1480859147370 ] 

* 초로 환산되어야되다는 얘기 같다.

▶ nbf : 토큰 활성 시간 [ 해당 날짜가 지나기 전의 토큰은 활성화 되지 않는다 ]

▶ iat : 토큰 발급 시간

▶ jti : JWT토큰 식별자, 중복방지를 위해 사용하며, 일회용 토큰 등에 사용된다.

② 공개 클레임

- 사용자 정의 클레임으로 공개용 정보를 위해 사용된다.

- 충돌 방지를 위해 URI포맷을 이용한다

 

예시)

{"https://www.admin.com/admin" : true}

 

③ 비공개 클레임

- 사용자 정의 클레임으로 서버와 클라이언트 사이에 임의로 지정한 정보를 저장한다.

예시)

{"token_type" : access}

 

3. SIGNATURE

 - 토큰을 인코딩하거나 유효성을 검증 할 때 사용되는 고유한 암호화 코드이다.

- 위에서 만든 HEADER와 PAYLOAD의 값을 각각 BASE64로 인코딩 하고, 그 값을 Secret Key(비밀키 기법)를 이용해        Header에서 정의한 알고리즘으로 해싱을 하고, 이 값을 다시  BASE64로 인코딩하여 생성한다.

 

*비밀키는 오직 서버만 알고있어야 하기 때문에 서버에 저장해둔다.

[인코딩을 ✌번 ]

 


JWT는 세션을 대체 할 수 없다?

JWT는 세션처럼 모든 사용자들의 상태를 기억하고 있지 않다. 따라서 기억하는 대상들의 상태를 언제든지 제어할 수가 없다.

 

예시로 세션을 이용한 경우는 한 기기에서만 로그인 가능한 서비스를 만들고 싶을 때에, PC에서 로그인하면 핸드폰에서의 세션값은 사용하지 못하고도록 제어가 가능하지만, JWT는 이미 제공한 토큰에 대해서 수정이 불가하고, 해커에게 토큰을 빼앗겼을 경우 토큰을 무효화 할 수 없다고 한다.

 

대응방법은 로그인시에 accessToken, refreshToken 두개의 토큰을 부여한다.

  • accessToken: 매번 인가를 받을 때 사용하는 토큰. (보통 수명이 짧음)
  • refreshToken: accessToken의 수명이 다했을 때 accessToken을 재발행 받기 위한 토큰 보통 2주정도 기간이 길게 잡힘
    (누군가를 로그아웃시키려면 refeshToken을 db에서 지워버리면 되는데 그래도 accessToken의 수명 동안은 바로 차단할 방법은 없음)

라고 한다..

'학습 > 이론' 카테고리의 다른 글

Class란?  (0) 2023.05.21
인덱스(INDEX)  (0) 2023.04.05
스토어드 프로시저  (0) 2023.04.05
PK와 FK  (0) 2023.04.04
쿠키와 세션  (0) 2023.04.04

+ Recent posts