기본 지식 정리
서버란 무엇인가?
Client와 server
- Client : 브라우저에서 서버에 정보를 요청하는 과정
- 사용자의 요청이 서버에 도달하기 위해서는 해당 서버의 정보가 필요하다(IP, Port)
웹 서버란?
- 웹 서버의 소프트웨어, website 컴포넌트 파일을 저장하는 컴퓨터
- 웹 사용자가 어떻게 호스트 파일에 접근하는지 관리
REST
- URL을 사용하여 리소스 식별 수행
- HTTP 메서드 (GET, POST, PUT 등) 을 적절하게 사용하는가? (restful)
HTTP
- 데이터를 주고받는 양식을 정의한 통신 규약
- Method :
GET,POST,DELETE등 - Header :
GET naver.com HTTP/1.1 - Payload : 실제 데이터
html,jsonGET은 Payload가 없다
DTO
- 데이터 전송 및 이동을 위해 생성되는 객체
- Client에서 보내오는 데이터를 객체로 처리할 때 사용
- 서버의 계층간 이동에도 사용
- DB와 연동할때도 DTO를 거친다.
3계층 아키텍처
- 프레젠테이션 계층 - 애플리케이션 계층 - 데이터 계층
IoC(제어의 역전)와 DI(의존성 주입)
- 의존성 : 파라미터나 변수 등으로 다른 객체를 참조하는 것
- 생성자 주입
- 세터 주입
- 필드 주입
- 제어의 역전 : 객체를 직접 생성하지 않고 스프링 컨테이너에 위임
- 라이브러리와 프레임워크의 차이 = 제어의 역전
DispatcherServlet와 Front Controller
- Front Controller : 모든 요청을 Front Controller이 우선 수신하고 요청에 따라 알맞은 처리기로 분배하는 디자인 패턴
- Spring framework에서는 DispatcherServlet가 Front Controller 역할을 맡는다.
ORM
- 객체와 데이터베이스를 맵핑해주는 도구
영속성 컨텍스트
- Entity 객체를 효율적으로 관리하기 위해 만들어진 공간
EntityManager
- Entity를 관리하는 관리자
- 개발자는 EntityManager을 통해 Entity를 저장하고 조회하고 삭제할 수 있다.
- EntityManagerFactory를 통해 만들어진다.
EntityManagerFactory
- DB하나에 하나만 생성된다.
/resources/META-INF위치에 persistence.xml 파일을 만들어 정보를 넣어둔다.
트랜잭션
- DB데이터들을 안전하게 관리하기 위해 생겨난 개념(무결성, 정합성)
- 여러개의 SQL이 하나의 트랜잭션에 포함될 수 있다.
- 하나의 sql문이 실패하면 모든 변경을 되돌린다
JPA 트랜잭션
- 영속성 컨텍스트에 Entity객체를 저장했다고 해서 DB에 바로 반영이 되지는 않는다
- 영속성 컨텍스트에 변경된 객체를 쓰기 저장소에 저장하고 있다가 한번에 DB에 반영
JPA 1차 캐시
- Map자료형태로 영속성 컨텍스트에 객체를 저장- key쪽에는 식별자 PK가 저장,value에 Entity
- 데이터베이스 조회 횟수를 줄인다.
- 데이터베이스 row 한 개당 객체 한 개가 사용되는 걸 보장(객체 동일성 보장)
JPA 쓰기 지연 저장소
- SQL을 모아두고 있다가 트랜잭션 commit 후 한번에 DB에 반영
flush
- 영속성 컨텍스트의 변경 내용들을 DB에 반영
- 쓰기 지연 저장소의 SQL문을 DB에 요청해주는 역할
DML
- 데이터베이스를 변경하는 요청(select 제외)
- JPA에서는 트랜잭션 환경이 아니면 수행되지 않는다.
변경 감지
- commit->flush가 호출된 후 1차 캐시에 저장되어 있는 객체랑 비교 후 update반영
- 최초 상태와 현재 상태를 비교 후 변경 내용이 있다면 UpdateQuery 발생
영속 상태
- persist() : 관리하고 싶은 엔티티 객체를 영속성 컨텍스트에 저장된다.
- 비영속 상태를 영속 상태로 변경
비영속 상태
- 영속성 컨텍스트가 관리하지 않는 상태(순수한 Entity)
준영속 상태
- 영속성 컨텍스트에 의해서 관리되고 있다가 분리된 상태
- detach, close, clear
merge
- 준영속 상태를 영속 상태로 변경
- 영속성 컨텍스트에 있다면 update, 없다면 insert
Intellij 정리
Auto Import 설정
- Setting -> auto import 검색
- Add unambiguous imports on the fly
- Optimize Import on the fly (코드가 변경됨에 따라 자동 import 생성, 삭제)
단축키 모음
Ctrl + D : 라인 복사
shift 두 번 : 탐색
Ctrl + Shift + backspace : 이전 화면 이동
Ctrl + Alt + L : 자동 정렬
Lombok
AllArgsConstructor : 필드를 모두 매개변수로 받는 생성자 생성
NoArgsConstructor : 기본 생성자 생성
RequiredArgsConstructor : 요구되는 필드 final 필드 생성자 생성
어노테이션
RestController : HTML에서 받는게 아니다.
RequestBody : JSON 형태로 값을 받아온다.
Component : Spring container가 관리하는 빈으로 등록(자동 감지)
Autowired : Spring이 필요한 Bean을 자동으로 주입(생성자가 단 하나만 있다면 없어도 자동 주입)
오류
type 'org. springframework. stereotype. Repository' does not have type parameters
리포지토리 타입 설정에 오류 발생
원인 : 잘못된 repository를 import했을 때 발생org.springframework.stereotype.Repository
- 어노테이션
- DAO 역할을 하는 스프링 Bean으로 표시하기 위해 사용
org.springframework.data.repository.Repository - 인터페이스
- 사용자가 직접 정의하는 리포지토리 인터페이스가 상속받도록 만들어진 marker 인터페이스
fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.
원인 : 현재 Git 레포지토리에 커밋에 하나도 없을 때 발생
HEAD는 현재 브랜치의 마지막 커밋을 가리키는 포인터
커밋이 하나도 존재하지 않으므로 Git이 기준점을 찾지 못함
fatal: working tree has modifications. Cannot add.
원인 : 현재 작업공간에 커밋되지 않은 변경사항이 있을 때 발생
git subtree, git merge 등 다른 브랜치나 레포지토리 내용을 합치는 작업은 현재 작업공간이 깨끗한 상태여야 한다.
해결 : 현재 작업상태에 README.md를 추가해서 최초 커밋 푸시
405 Method Not Allowed
원인 : 서버가 클라이언트의 요청을 받았지만, 해당 URL(path: "/members/signup")에 대해 허용되지 않은 HTTP 요청 방식(Method)을 사용했기 때문에 요청을 처리할 수 없다는 뜻
해결 : GET방식으로 보내던걸 Post방식으로 변경