본문 바로가기

Java

Spring 정리

기본 지식 정리

서버란 무엇인가?
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, json GET은 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방식으로 변경

'Java' 카테고리의 다른 글

N + 1  (2) 2025.07.22
Interceptor  (4) 2025.07.21
자바 계산기 구현  (4) 2025.07.12
추상화와 상속  (2) 2025.07.10
클래스 문법  (1) 2025.07.08