항해99 최종발표를 끝내자마자 코로나에 걸렸다..........
정말 2주동안 너무 아팠다ㅠㅠㅠ 그동안 열심히 달려오다가 잠시 쉬어서 나쁘지는 않았지만 2주 잠깐 쉬었다고 머리가 리셋이 된 기분이다. 그래서 기본적이지만 내가 아직도 자신있게 말하지 못하는 이런 저런 자바 관련 끄적임을 적어보고자 한다. (두서없이 생각나는 것들 이것저것 적어서 정신 없을 수 있음)
자바란?
자바(Java)는 C언어에 객체 지향적 기능을 추가하여 만든 C++과는 달리, 처음부터 객체 지향 언어로 개발된 프로그래밍 언어. 자바는 자바 가상 머신(JVM, Java Virtual Machine)을 사용하여, 운영체제와는 독립적으로 동작할 수 있음. 따라서 자바는 어느 운영체제에서나 같은 형태로 실행될 수 있다. 바로 이러한 점이 수많은 개발자로 하여금 자바를 사용하게 하는 원동력이 되고 있다.
Spring MVC가 무엇인지: Spring MVC는 스프링에서 제공하는 웹모듈로 Model, View, Controller 세가지 구성요소를 사용해 사용자의 다양한 HTTP Request를 처리하고 단순한 텍스트 형식의 응답부터 REST 형식의 응답은 물론 view를 표시하는 html을 return하는 응답까지 다양한 응답을 할 수 있도록 할 수 있는 framework.
스프링 프레임워크는 기능이 많은 만큼 환경설정이 복잡한 편이다. 이 것에 어려움을 느끼는 사용자들을 위해 나온 것이 스프링 부트다. 부트는 스프링 프레임워크를 사용하기 위한 설정의 많은 부분을 자동화해준다. 스프링 부트 starter 디펜던시만 추가해주면 바로 API를 정의하고 내장된 톰켓이나 제티로 웹 어플리케이션 서버를 실행할 수 있다.
RDB (Relational Database): 관계형 데이터 모델에 기초를 둔 데이터베이스이며 모든 데이터를 2차원 테이블 형태로 표현한다.
RDBMS장점,단점
-DATA를 column과 row형태로 저장
데이터의 분류, 정렬, 탐색 속도가 비교적 빠름, sql이라는 구조화된 질의를 통해 데이터를 다룰 수 있음. 직업의 완전성을 보장함. 데이터의 업데이트 빠름.
그러나, 반드시 스키마 규격에 맞춰서 데이터를 다뤄야하고, 데이터처리에 대한 부하 발생시 처리가 어려움.
NoSQL 장점,단점
-데이터간의 관계를 정의하지 않음. 테이블간의 관계(join)불필요. RDBMS 보다 복잡도가 떨어져 훨씬 대용량의 데이터를 저장 및 관리 할 수 있음. 테이블에 스키마가 정해져있지않아 데이터 저장이 비교적 자유로움.
그러나, Key값에 대한 입출력만 지원하고 스키마가 정해져있지않아 데이터에 대한 규격화가 되어있지않음. 데이터를 업데이트하는데 비교적 느림.
websocket(server push)
실시간 양방향 통신을 위한 스펙으로 서버와 브라우저가 지속적으로 연결된 TCP라인을 통해 실시간으로 데이터를 주고받을 수 있도록 하는 HTML5 사양이다. 연결지향 양방향 전이중 통신이 가능하며 채팅, 게임, 주식 차트 등에 사용된다. polling은 주기적으로 HTTP 요청을 수행하지만, websocket은 연결을 유지하여 서버와 클라이언트 간 양방향 통신이 가능하다.
SSE(server-sent-event)
이벤트가 [서버 -> 클라이언트] 방향으로만 흐르는 단방향 통신 채널이다. SSE는 클라이언트가 polling과 같이 주기적으로 http 요청을 보낼 필요없이 http 연결을 통해 서버에서 클라이언트로 데이터를 보낼 수 있다.
JWT / spring security
JWT: JSON을 암호화하여 문자열로 토큰을 표현하므로 안드로이드 애플리케이션과 백엔드 간의 REST 서비스로 제공이 가능하다.
쿠키를 사용하지 않기 때문에 JWT 인증은 CORS 공격이 불가능하다.
트래픽에 대한 부담이 낮고 세션 관리를 위한 별도의 DB(레디스) 구성이 필요하지 않다.
안드로이드 애플리케이션, 백엔드 서버, 손 제스처 인식(파이썬)의 세 가지 구조로 이루어져 있어 마이크로 서비스 환경에서 쉽게 적용이 가능하다.
Stateless 하며 필요시 Claims 을 설정하거나, access & refresh token으로 분리하여 구성이 가능하다.
Spring Security: Spring 기반의 애플리케이션의 보안(인증과 권한, 인가 등)을 담당하는 스프링 하위 프레임워크이다. Spring Security는 인증과 권한에 대한 부분을 Filter의 흐름에 따라 처리.
보안과 관련해서 체계적으로 많은 옵션을 제공해주기 때문에 개발자가 일일이 보안 관련 로직을 작성하지 않아도 된다는 장점이 있습니다.
Spring Security를 관통하는 가장 핵심 개념은 인증과 인가입니다.
쉽게 이해하기 위해서 간단한 예를 들자면 은행에 금고가 있고, 사용자가 금고를 열어본다고 가정하면 다음과 같은 과정을 거치게 됩니다.
인증(Authentication)
• 해당 사용자가 본인이 맞는지 확인하는 절차
• 위 예시에서 1번에 해당
인가(Authorization)
• 인증된 사용자가 요청한 자원에 접근 가능한지를 결정하는 절차
• 위 예시에서 3번에 해당
• Spring Security는 기본적으로 인증 절차를 거친 후에 인가 절차를 진행하게 되며, 인가 과정에서 해당 리소스에 대한 접근 권한이 있는지를 확인하게 됩니다.
• 이러한 인증과 인가를 위해 Principal을 아이디로, Credential을 비밀번호로 사용하는 Credential 기반의 인증 방식을 사용합니다.
• Principal(접근 주체): 보호 받는 리소스에 접근하는 대상
• 캐시란?
캐시(Cache)는 웹 페이지 요소를 저장하기 위한 임시 저장소이고, 쿠키/세션은 정보를 저장하기 위해 사용된다.
캐시는 웹 페이지를 빠르게 렌더링 할 수 있도록 도와주고,
쿠키/세션은 사용자의 인증을 도와준다.
• 쿠키와 세션의 차이: 큰 차이점은 사용자의 정보가 저장되는 위치이다. 쿠키는 서버의 자원을 전혀 사용하지 않으며, 세션은 서버의 자원을 사용한다. 세션은 쿠키를 이용해서 session-id만 저장하고 그것으로 구분하여 서버에서 처리하기 때문에 비교적 보안성이 높다.
Spring의 특징: JAVA의 웹 프레임워크로 JAVA 언어를 기반으로 사용한다. JAVA로 다양한 어플리케이션을 만들기 위한 프로그래밍 틀
제어의 역전(IOC : Inversion of Control)
스프링은 그 자체가 구조를 설계할 수 있어서 개발자가 부품을 만들어 조립하는 형태의 개발이 가능하다. 이렇게 조립된 코드의 최종 호출은 개발자가 결정하는 것이 아니라 스프링 프레임워크 내부에서 이루어지는데, 이것을 제어의 역행(IoC)라고 함. 즉, 사용자가 직접 new 연산자를 통해 인스턴스를 생성하고 메서드를 호출하는 일련의 생명주기에 대한 작업들을 스프링에 위임할 수 있게 되는 것이다.
IOC는 직관적이지 못하기 때문에 IOC를 구현하는 방법으로는 의존성 주입(DI)이 있음.
의존성 주입(DI : Dependency Injection)
객체 사이에 필요한 의존 관계에 대해서 스프링 컨테이너가 자동으로 연결해 주는 것을 말한다. 스프링 컨테이너는 DI를 이용하여 빈(Bean) 객체를 관리하며, 스프링 컨테이너에 클래스를 등록하면 스프링이 클래스의 인스턴스를 관리해준다.
객체 사이에 필요한 의존 관계에 대해서 스프링 컨테이너가 자동으로 연결해 주는 것을 말하며, 스프링 컨테이너는 DI를 이용하여 빈(Bean) 객체를 관리하고, 스프링 컨테이너에 클래스를 등록하면 스프링이 클래스의 인스턴스를 관리해 준다.
관점지향(AOP): 기존 비즈니스 로직에는 손을 대지 않고 AOP를 활용하여 추가할 수 있음. 특정 메소드가 끝날 때 호출할 수도 있고, 호출 직전, 메소드가 리턴한 직후 혹은 예외가 발생했을 때 등 여러가지 상황에 활용할 수 있다. (로깅, 보안, 트랙잭션과 같은 공통 기능을 핵심 비즈니스 모듈로부터 분리해서 각 핵심 비즈니스 모듈에 적용할 수 있다.)
JPA(Java Persistence API)
• Java 진영에서 객채관계매핑ORM(Object-Relational Mapping) 기술 표준으로 사용하는 인터페이스 모음
• 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
• 인터페이스 이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현함(hibernate: 자바 진영의 다양한 오알엠 프레임워크 중 가장 많이 사용되는 프레임워크)
영속성(persistence)이란?
데이터를 생성한 프로그램의 실행이 종료되더라도 사라지지 않는 데이터의 특성을 의미한다.영속성은 파일 시스템, 관계형 테이터베이스 혹은 객체 데이터베이스 등을 활용하여 구현한다.영속성을 갖지 않는 데이터는 단지 메모리에서만 존재하기 때문에 프로그램을 종료하면 모두 잃어버리게 된다.