-
IP address
배달을 받을 때 집마다 다른 주소가 있어서 우리 집에 배달올 것이 다른 집으로 가지 않듯이
장치에서 요청한 응답이 해당 장치로 올 수 있도록 네트워크에 연결된 장치들에 부여된 주소이다.
네트워크에 연결된 장치는 모두 IP주소를 갖고 있게 된다.
application.properties
Spring Boot Application을 생성했을 때 src/main/resources 폴더에 생기는 파일이다.
이 파일은 어플리케이션과 관련된 속성값들을 작성할 때 사용한다.
포트 변경, 어플리케이션 명명, DB연결 등을 이 파일을 통해 할 수 있다.
Web content's Origin
URL의 scheme, host, port로 정의된다.
scheme과 host와 port가 모두 같을 때 같은 오리진으로 인식되고,
하나라도 다르다면 다른 오리진으로 인식된다.
SOP
다른 오리진의 요청을 제한하는 보안 정책
CORS
원래는 SOP때문에 다른 오리진에서 온 요청을 모두 제한하지만, 허용하고 싶은 경우에 사용한다.
Cross-Origin Resource Sharing의 약자이다.
HTTP 헤더를 통해 한 origin에 자신 외에 다른 origin에서 요청할 수 있도록 허용하는 것을 말한다.
서로 다른 오리진 사이에 자원을 공유할 수 있게 하는 것을 의미한다.
client가 서버에 어떤 요청을 했을 때 아래와 같이 CORS에러가 뜰 수 있다.
요청이 한 오리진에서 다른 오리진으로 갈 때 브라우저에게 다른 오리진에서 오는 요청을 허락한다는 것을 알려줘야 되기 때문에
Access-Control-Allow-Origin헤더로 허용된 오리진을 설정을 해야한다.
Java Bean
특정 컨벤션을 따르는 자바 클래스를 자바빈이라고 한다.
자바빈은 default생성자를 가지고 있고, Serializable하고, 필드에 대한 setter와 getter를 가지고 있어야 한다.
관련있는 값들을 자바빈으로 묶어두면 캡슐화에 용이하다.
Serializable
Serializable인터페이스를 구현하게 되면 클래스가 Serializable해진다.
Serializable한 클래스는 Serialization, Deserialization이 가능해진다.
Serialization은 객체를 저장되거나 통신할 수 있는 상태로 바꾸는 것을 의미하고, (이 때 되돌리는 것도 가능해야 한다.)
Deserialization은 저장되거나 통신된 상태에서 객체로 변환하는 것(되돌리는 것)을 의미한다.
DTO (Data Transfer Object)
계층 간에 데이터를 주고 받을 수 있게 해주는 객체이다.
DTO는 비즈니스 로직을 가지고 있지 않다.
Content-Type
HTTP 헤더의 일종이다.
Content-Type 헤더는 자원의 원래 타입을 나타낼 때 사용한다.
ObjectMapper
Jackson 라이브러리에 포함된 클래스이다.
JSON을 읽고 쓰는 기능을 제공한다.
즉, Java Bean과 JSON 사이를 오고 가게 도와주는 클래스이다.
Layered Architecture
하나의 프로그램을 각기 다른 관심사를 갖고 있는 여러 층으로 구성하는 아키텍처를 의미한다.
관심사에 따라 계층을 분리함으로써 유지 보수가 용이해진다.
UI Layer
사용자와 직접 소통하는, 화면에 정보를 표현하는 관심사를 가진 계층에 해당한다.
Application Layer
비즈니스 로직의 진입점에 해당한다.
Service 계층이 여기에 속한다.
모든 유저 케이스를 담고 있다.
Domain Layer
도메인 로직을 다루는 계층이다.
Multi-thread(쓰레드)
하나의 프로세스를 수행할 때 두 개 이상의 스레드가 동시에 작업을 수행하는 것을 의미한다.
멀티 스레드는 스레드들이 자신이 속한 프로세스의 메모리를 공유하기 때문에 자원의 낭비가 적다.
하지만 리소스를 공유할 때 서로 간섭이 일어날 수 있기 때문에 주의해야 한다.
NullPointException
null이 아닌 객체가 필요한 곳에 null이 들어 있는 경우 발생하는 예외이다.
null 객체의 메소드에 접근하려 하거나
null 객체의 필드에 접근하거나 필드를 수정하는 경우,
null의 길이를 구하려는 경우,
null을 배열처럼 인덱스로 접근하는 경우 발생한다.
checked vs unchecked Exception
예외는 프로그램 실행 중에 발생한 원치 않거나 예상치 못한 경우에 해당한다.
자바에는 checked exception과 unchecked exception 두 가지의 예외가 있다.
checked exception은 컴파일할 때 확인이 되는 예외이다.
만약 어떤 메소드가 checked exception을 발생시키면 그 메소드가 예외 처리를 하거나, throws를 반드시 붙여줘야 한다.
unchecked exception은 컴파일할 때 확인되지 않는 예외이다.
RuntimeException과 Error을 상속받은 예외들은 unchecked exception에 해당한다.
RuntimeException
JVM에서 실행되는 중에 발생할 수 있는 예외에 해당한다.
unchecked exception이기 때문에 throws를 붙여주지 않아도 된다.
try ~ catch
예외를 처리할 수 있는 구문이다.
try 부분에 실행 중 에러가 발생할 수 있는 코드를 작성하고,
catch 부분에 try를 실행할 때 에러가 발생한 경우 실행할 코드(즉 예외를 처리하는 코드)를 작성하면 된다.
finally
try ~ catch구문에서 에러가 발생하든 안 하든 언제나 실행해야 하는 코드가 있을 때 finally부분에 작성해주면 된다.
throw
직접 에러를 발생시킬 수 있도록 해주는 구문이다.
exception과 함께 쓰이고, exception은 RuntimeException등을 상속받아 커스텀으로 만들 수 있다.
Spring Validation
사용자가 입력한 값의 유효성 검증을 도와주는 툴이다.
필수 입력값을 입력을 하지 않았거나, 올바르지 않은 값을 입력한 경우를 잡아줄 수 있다.
자주 사용되는 Validation annotation에는 @NotNull @NotBlank @Min @Max @Size @Pattern 등이 있다.
Spring Data JPA (Java Persistance API)
JPA를 쉽게 사용할 수 있도록 도와주는 도구이다.
이 도구를 사용하면 레포지토리의 인터페이스만 정의해주면 된다.
in-memory
데이터를 메모리에 저장하는 데이터베이스이다.
디스크에 접근하지 않아서 반응 속도가 빠르다.
휘발성 메모리에 저장하기 때문에 영속성이 보장되지 않는다.
DAO
data access object의 약자이다.
DB에 접근하는 객체를 뜻한다.
상위 계층에서 persistence layer에 요청이 오면 DAO가 처리를 해주어 application layer와 persistence layer를 구분지을 수 있게 도와준다.
H2 Database
자바로 작성된 관계형 데이터베이스이다.
인메모리 방식과 디스크 방식을 모두 지원한다.
JPA의 Entity와 객체지향의 Entity
JPA의 Entity는 DB에 저장되는 데이터를 나타내는 POJO에 해당한다.
JPA Entity의 인스턴스는 테이블의 row를 표현한다.
객체지향의 Entity는 식별자로 구분되는 객체를 의미한다.
interface
시그니처의 모음이다.
구현 없이 해당 기능을 어떻게 사용할 수 있을 지에 대한 정보를 가지고 있다.
spy vs mock
spy는 원래 것을 그대로 가져다가 쓰는데 일부만 내가 원하는 대로 바꾸고 싶을 때 사용하고,
mock은 아예 빈 것을 만들고 필요한 모든 것을 내가 정의하고 싶을 때 사용한다.
hibernate
Java를 위한 ORM 도구이다.
JPA 인터페이스를 구현한 JPA 구현체이다.
자바 객체를 관계형 데이터베이스로 매핑해준다.
verify
Mockito의 verify메소드로 특정 메소드를 검증할 수 있다.
모킹을 한 객체의 메소드를 검증할 수 있고,
만약 모킹을 하지 않았다면 객체를 spy()로 감싸주면 verify로 해당 객체의 메소드를 검증할 수 있다.
Spring Profile
프로파일에 따라 구분하고 싶은 경우에 사용할 수 있다.
Bean을 각기 다른 프로파일(test, production, ...)에 매핑하면
각각의 프로파일에 해당하는 빈들만 사용할 수 있게 된다.
Database Transaction
데이터베이스 상태를 변환시킬 때 수행되어야 하는 일련의 과정을 의미한다.
트랜잭션으로 원하는 작업의 단위를 정하면 해당 작업이 모두 잘 되거나 모두 실패하게 된다.
즉, 일부만 실행되지 않게 된다.
트랜잭션은 아래와 같은 특성을 가지고 있다.
- 원자성
하나의 트랜잭션은 쪼개질 수 없다는 뜻이다.
트랜잭션의 일부만 성공할 수 없고, 모두 성공하거나 모두 실패하게 된다.
- 독립성
트랜잭션이 수행되는 도중에 다른 트랜잭션이 개입하지 않는 것이 보장된다.
Database Atomicity
transaction의 특성 중 하나이다.
DB수정을 일부만 할 수 없고, 모두 성공하거나 모두 실패하게 된다는 특성이다.
DB에 일부만 반영이 되었을 때 아예 실패하는 것보다 문제가 될 수 있기 때문에 DB atomicity가 중요하다.
예를 들어 atomicity가 보장되지 않는다면 중요한 보고서를 보내는 데 성공했다고 떠도, 실제로 받지 못했을 수 있다.
왜냐하면 보내기는 성공했으나 가는 중에 무슨 문제가 생겨 가지 못했을 수 있기 때문이다.