frame 틀 안에서 work 동작한다.
기본 틀을 제공해줘서 신입 개발자도 쉽게 사용할 수 있다.
무료이며 소스코드가 공개되어 있고 고쳐서 사용할 수 있다.
주도권이 스프링에 있다.
class : 설계도
object : 실체화가 가능한 것
instance : 실제로 실체화 돼서 존재하는 것
오브젝트를 개발자가 직접 new하면 이 메서드가 아닌 다른 메서드에서 사용하기 힘들다.
오브젝트를 스프링이 관리하면 개발자가 원하는 곳에서 사용하기 쉽다.
스프링이 관리하는 오브젝트를 개발자가 원하는 곳에서 사용하는게 DI
어느 곳에서 사용하든 똑같은 오브젝트(싱글톤)
필터는 톰캣 가장 앞에서 동작한다.
스프링과 관계없이 전부 적용된다.
web.xml에서 설정한다.
인터셉터는 필터를 통과한 이후 스프링 컨테이너에서 동작한다.
세부적인 권한체크
관점 지향 프로그래밍
공통 기능을 만들어놓고 리플렉션으로 넣을곳을 분석해서 알맞게 끼워넣는다.
공통 기능 (관점에 따라 다르게 동작함)
관심사 분리 (핵심로직만 집중할 수 있게)
@
주석+힌트
런타임때 분석하는 기법
Message Converter가 오브젝트를 json으로 변환해 준다.
InputStream은 바이트 단위로 읽음(문자가 아닌 바이트 그대로 받음.)
char로 캐스팅을 해서 처리해야하는데 복잡함
InputStreamReader 클래스로 바이트를 감싸면 문자를 줌
InputStreamReader는 배열로 문자 여러개 받아짐
배열이라서 크기가 고정되어 있어서 잘 사용하지 않음
BufferedReader로 감싸면 가변길이의 문자를 받을 수 있음
@ResponseBody 어노테이션 : BufferedWriter
@RequestBody 어노테이션 : BufferedReader
자바에서 ORM을 적용한게 JPA
자바랑 DB랑 사이에서 매핑
자바 객체를 DB로 보낼때 쿼리로 만들어주고
DB 조회한걸 자바로 보낼때 객체로 만들어주고
JPA(Java Persistence API)는 자바 언어와 데이터베이스 사이에서 객체와 관계형 데이터베이스의 매핑(Mapping)을 수행하는 자바 표준 인터페이스입니다. JPA는 객체 지향 프로그래밍과 관계형 데이터베이스 간의 불일치를 해결하고, 자바 객체와 데이터베이스 테이블 간의 변환 및 연결을 단순화하는 역할을 합니다.
JPA는 객체를 데이터베이스에 저장하거나 데이터베이스에서 가져오는 작업을 처리합니다. 주요 기능으로는 객체와 테이블 간의 매핑, 데이터베이스 CRUD(Create, Read, Update, Delete) 작업, 객체 간의 관계 처리 등이 포함됩니다.
객체와 테이블 매핑: JPA는 자바 클래스와 데이터베이스 테이블 간의 매핑을 설정합니다. 애노테이션을 사용하여 매핑 정보를 지정하거나 XML 매핑 파일을 사용할 수 있습니다.
CRUD 작업: JPA는 자바 객체의 생성(Create), 조회(Read), 수정(Update), 삭제(Delete) 작업을 데이터베이스에 대응하도록 처리합니다. 객체를 생성하면 해당 데이터가 데이터베이스에 삽입되고, 객체를 조회하면 데이터베이스에서 해당 데이터를 가져옵니다.
객체 간의 관계: JPA는 객체 간의 연관 관계와 관련된 데이터베이스의 외래 키(Foreign Key) 관계를 처리합니다. 객체 간의 관계를 설정하고, 이를 데이터베이스 스키마에 맞게 매핑합니다.
JPQL(Java Persistence Query Language): JPA는 객체 지향적인 쿼리 언어인 JPQL을 제공합니다. JPQL을 사용하여 객체를 대상으로 쿼리를 작성하고 실행할 수 있습니다.
JPA를 사용하면 자바 객체를 데이터베이스로 보낼 때 INSERT, UPDATE, DELETE 쿼리를 자동으로 생성하고 실행하여 데이터베이스와 자바 객체 간의 변환 작업을 간소화할 수 있습니다. 또한 데이터베이스에서 조회한 결과를 자바 객체로 변환할 때 SELECT 쿼리를 자동으로 생성하여 처리합니다.
ORM은 객체 지향 프로그래밍 언어인 자바와 관계형 데이터베이스 간의 불일치를 해결하고, 객체와 데이터베이스 간의 변환을 자동화하여 개발자의 작업을 간소화
객체-관계 불일치 해결: 객체 지향 프로그래밍 언어와 관계형 데이터베이스 간에는 다양한 불일치가 존재합니다. 예를 들어, 객체는 상속, 다형성, 연관 관계 등을 지원하지만, 데이터베이스는 테이블 구조로 데이터를 저장합니다. ORM은 이러한 불일치를 해결하여 객체와 테이블 간의 변환을 쉽게 처리합니다.
CRUD 작업 간소화: ORM을 사용하면 객체를 생성(Create), 조회(Read), 수정(Update), 삭제(Delete)하는 작업을 객체 지향적으로 처리할 수 있습니다. 개발자는 SQL 쿼리를 직접 작성하지 않고도 객체에 대한 CRUD 작업을 수행할 수 있습니다.
성능 최적화: ORM은 데이터베이스와의 상호작용을 최적화하여 성능을 향상시킬 수 있습니다. 캐싱, 지연 로딩, 배치 처리 등을 통해 효율적인 데이터 접근 방식을 지원합니다.
데이터베이스 독립성: ORM은 데이터베이스 종속성을 줄여주어 여러 종류의 데이터베이스 시스템에 대한 호환성을 제공합니다. 개발자는 데이터베이스 변경 시에도 큰 수정 없이 코드를 유지할 수 있습니다.
엔터티(Entity)의 상태를 관리하고 엔터티의 생명주기를 추적하는 역할을 합니다.
영속성 컨텍스트는 엔터티와 데이터베이스 간의 중간 계층으로 작동하며,
엔터티의 변경을 추적하여 데이터베이스에 동기화하고 캐싱하며 성능을 최적화하는 역할을 합니다.
엔터티의 상태 관리: 영속성 컨텍스트는 엔터티의 상태 변화를 추적하고, 엔터티의 변경이 어떤 상태에 있는지를 관리합니다. 엔터티를 생성하거나 조회한 후에는 이 엔터티가 영속성 컨텍스트에 관리되며, 엔터티의 변경을 영속성 컨텍스트가 추적합니다.
캐싱: 영속성 컨텍스트는 데이터베이스에서 조회한 엔터티를 캐시에 저장합니다. 이를 통해 같은 엔터티를 반복적으로 조회할 때 데이터베이스에 매번 접근하지 않고 캐시에서 읽어와 성능을 향상시킬 수 있습니다.
변경 감지: 영속성 컨텍스트는 엔터티의 상태 변화를 감지하여 자동으로 UPDATE 쿼리를 생성하고 데이터베이스와 동기화합니다. 엔터티의 변경 사항이 발생하면 JPA가 알아서 데이터베이스에 변경을 반영합니다.
트랜잭션 지원: 영속성 컨텍스트는 트랜잭션 범위에 따라 엔터티의 변경을 추적합니다. 트랜잭션 커밋 시에 변경된 내용을 데이터베이스에 반영하게 됩니다.
지연 로딩 및 즉시 로딩: 영속성 컨텍스트는 엔터티 간의 연관 관계에서 지연 로딩(Lazy Loading)과 즉시 로딩(Eager Loading)을 지원합니다. 필요한 데이터만 로딩하여 데이터베이스 접근을 최적화할 수 있습니다.
동일성 보장: 같은 엔터티를 조회하면 영속성 컨텍스트에서는 항상 같은 인스턴스를 반환하여 객체 동일성을 보장합니다.
소켓통신
계속 연결되어 있어서 부하가 심함
HTTP 통신 : stateless 방식
요청에 대해 응답을 하고 연결이 끝남
부하가 적음
기존 연결했던 사용자인지 구별을 못함
아파치(웹서버) : 요청한 파일을 응답한다.
톰캣(WAS) : 자바 코드를 요청하면 컴파일해서 html로 변환해서 준다.
URL : 자원 접근 (Location) http://naver.com/a.png
URI : 식별자 접근 (Identity) http://naver.com/picture/a
스프링은 URL 자원 접근을 막아둠
무조건 자바를 거친다
FrontController+RequestDispatcher
https://www.youtube.com/watch?v=XBG6CUtVCIg&list=PL93mKxaRDidG_OIfRQ4nztPQ13y74lCYg