전체 글 361

REST API 성숙도 모델 (Maturity Model) [Richardson Maturity Model]

REST API 성숙도 모델 Rechardoson의 REST API 성숙도 모델이라는 것을 정리한다. 성숙도 모델은 총 4단계로 나누어져서 각 단계의 조건에 만족할 수록 REST API에 가까워진다고 한다. Level 0 Level 0은 웹 매커니즘을 사용하지 않고 HTTP를 원격 호출을 위한 전송 시스템으로 사용하는 경우이다. RPC(Remote Procedure Call)처럼 리소스 구분 없이 설계된 HTTP API이다. 하나의 End-point를 사용해서 HTTP Method도 반드시 POST가 된다. 그래서 서로 다른 매개변수를 통해서만 여러 동작을 하게 된다. Request POST /api/user { "function": "getUser", "arguments" [ "1" ] } Respon..

Operation/Rest API 2022.04.28

Spring - 필터(Filter)와 인터셉터(Interceptor)의 차이

필터(Filter) / 인터셉터(Interceptor) / AOP 스프링에서 요청이 구현한 Controller Layer로 들어오기 전에 처리해야 하는 작업이 있다. 대표적으로 인증 인가, XSS 방어, 데이터 압축, 인코딩 등이 있다. 이러한 작업들은 공통 관심사로 보고 분리하는 것이 것이 효율적이다. 이때 사용할 수 있는 것이 필터(Filter)와 인터셉터(Interceptor), Spring AOP이다. 문제는 해당 기술들이 어떠한 장단점이 있으며, 어떤 경우에 적합한 지 또는 어떤 경우에 부적절한 지 등이 정리가 잘 되어있지 않다. 해당 포스팅에서는 그러한 기준을 정리한다. 필터(Filter) 필터(Filter)는 스프링이 지원하는 기능이 아닌, J2EE 표준 스펙에 있는 기능으로 가장 앞단에 존..

Server/Spring 2022.04.27

Java - JVM 구성 요소와 역할 정리! (+ JIT 컴파일러, 인터프리터, 클래스 로더, 가비지 컬렉터란 무엇인가?)

JVM이란 JVM(Java Virtual Machine)은 자바 프로그램의 실행하기 위해 물리적 머신과 유사하게 소프트웨어로 구현한 것이다. JVM 역할은 자바 애플리케이션을 클래스 로더를 통해 읽어 들여 자바 API와 함께 실행하는 것이다. JVM은 JAVA와 OS사이에서 중개자 역할을 수행하여 JAVA가 OS에 구애받지 않고 재사용을 가능하게 해준다. 그리고 메모리관리, Garbage collection을 수행한다. 추가적으로 JVM은 스택 기반의 VM(가상머신)이다. Lua VM, Dalvik VM 등은 레지스터 기반으로 동작하는데 비해 JVM은 스택 기반으로 동작한다. 스택 기반 VM 스택 기반 VM은 다음과 같은 장점을 가진다. 코드 작성과 컴파일이 쉽다. 속도는 레지스터 기반 VM보다 느리지만..

Language/Java 2022.04.27

Javascript - Optional chaining [ES2020] (Cannot read properties of undefined를 해결하기 위한 다양한 방법!)

Nested object Nested object를 설명하기 위해 아래와 같은 클래스를 만들었다. class Dto { filter: Filter; page: Page; sort: Sort; } interface Filter { [key: string]: { operator: string; value: string; } } const dto = new Dto(); 비즈니스 로직에서 dto.filter.search.value의 존재 유무에 따라 쿼리가 달라진다고 가정하자. 그럼 dto.filter.search.value의 존재 유무를 알 수 있는 방법은 뭘까? if(dto.filter.search.value) { // ... 생략 } else { // ... 생략 } 이렇게 하면 처리가 될까? 안된다! V..

Java - JDK와 JRE 차이 정리!

JDK와 JRE의 차이 아래는 Oracle에서 JDK와 JRE의 범위에 대해 표현한 그림이다. JRE JRE(Java Runtime Environment)는 자바 가상 머신( Java Virtual Machine ), 자바 클래스 라이브러리(Java class library), 자바 명령(Java command) 및 기타 인프라를 포함한 컴파일된 Java 프로그램을 실행하는데 필요한 패키지이다. JRE는 환경(Environment)이다. 기본적으로 Java 관련 파일이 있는 디렉터리이다. 포함되어 있는 폴더와 파일에 대해 설명을 간단하게 하면 아래와 같다. bin: Java 실행 프로그램이 포함되어 있다. JVM을 시작하는 java(Window의 경우 javaw)가 포함되어 있다. 또한, keytool ..

Language/Java 2022.04.26

직접 만든 예시로 보는 SOLID 원칙!

객체 지향 설계 5원칙 SOLID에 대해 알아보자. SRP: Single Responsibility Principle 단일 책임 원칙 Bad 아래 클래스가 있다. class UserData { String id; String username; } 그리고 아래와 같이 UserData 클래스를 무분별하게 사용한다. class UserController { UserData getUser() {} void postUser(UserData userData) {} } class UserService { UserData getUser() {} } 여기서 패스워드 변경 기능이 추가되면 UserData에 password 필드를 추가해야 한다. class UserData { String id; String username..

Programming/OOP 2022.04.25

해시 충돌(Hash Collision)이란? [+ 전략 비교]!

해시 충돌(Hash Collision) 해시 자료구조에서는 hashCode로 먼저 비교를 하고, 결과가 같다면 equals로 추가로 비교한다. 관련하여는 자바에서 equals와 hashCode의 관계를 다루는 이전 포스팅 (https://jaehoney.tistory.com/168)을 참고하자. 요약하자면, 해시 알고리즘에서 낮은 확률로 다른 Instance이지만 같은 HashCode를 가질 수 있다. 우리가 아는 해시 테이블의 구조는 아래와 같이 생겼다. 그렇다면, 만약 여기서 새로운 Instance가 추가 되었는데, 해시(Hash)를 적용하니 HashCode가 01이 나왔다! 그러면 기존의 01번 버킷에 데이터를 덮어쓰면 될까? 당연히 안된다. 해당 포스팅에서는 이런 경우에 새로운 데이터는 어디에 저..

Language/Algorithm 2022.04.24

Java - Equals()랑 HashCode()를 반드시 같이 재정의해야 하는 이유!

equals() Equals와 HashCode를 재정의하는 이유와 둘 사이에 관계에 대해 알아보자. Point라는 클래스가 있다고 가정한다. class Point { int x; int y; Point(int x, int y) { this.x = x; this.y = y; } } 그리고 아래의 테스트를 돌려보면 테스트가 깨진다. equals가 기본적으로 java core 라이브러리에 있는 equals로 동작하는데 내부적으로 참조(주소)를 기준으로 비교하기 때문이다. @Test void test() { Point point1 = new Point(1, 2); Point point2 = new Point(1, 2); Assertions.assertThat(point1).isEqualTo(point2); //..

Language/Java 2022.04.24

자바(Java)의 장단점 정리! [+ Spring vs Node.js + Express 비교]

자바(Java) 이전에 가전 제품에 C++을 플랫폼 독립적으로 확장한 Oak라는 언어가 있었는데, 인터넷이 확장되면서 네트워크 통신이 적합하도록 방향을 잡고 언어의 이름을 변경했다. 그게 자바(Java)다. 이번 포스팅에서는 자바(Java)의 장단점에 대해 다룬다. 그리고 추가적으로 Java(Spring)과 (Node + Express)를 비교하는 부분을 설명한다. 자바의 장점 객체 지향 프로그래밍의 장점을 충분히 반영하고 있다. 클래스, 상속, 다형성, 캡슐화, 추상화 등을 지원 플랫폼 종속적이지 않다. 많은 국내 개발자, 레퍼런스와 강의가 있다. 더 구조적이고 효율적인 코드 작성을 할 수 있다. 오픈소스도 많아서 안정적인 애플리케이션을 빠르게 개발할 수 있다. 보안, 운영측면에서 모두 안정적이다. 멀..

Language/Java 2022.04.24

CORS 총정리!! (+ Cannot use wildcard in Access-Control-Allow-Origin when credentials flag is true 해결)

SOP (Same-Origin Policy) SOP는 같은 출처에서만 리소스를 공유할 수 있다는 정책이다. 개발을 하다가 HTTP HTTPS 간 통신에만 CORS 에러가 나는 경험이 많이 있었는데 그 이유가 SOP 정책 때문이다. 출처를 비교할 때는 URL의 구성요소 중 Protocol, Host, Port 3가지가 모두 동일해야 한다. https://www.honey.com/로 요청을 보낸다고 가정하자. https://www.honey.com/resources -> 가능 https://www.honey.com/resources?query=상품 -> 가능 http://www.honey.com/ -> 불가능 (프로토콜이 다르다) https://www.bee.com/ -> 불가능 (호스트가 다르다) 그렇다면..

Operation/Network 2022.04.22