Java/Spring

스프링 공부 정리 2

본명은이점례 2023. 8. 23. 20:27
728x90

공유를 목적으로 하는 것 아닌 개인 단순 정리 글입니다.

 

 

was(web application server)
웹서버(정적리소스[html,css,js,이미지])+ 동적(애플리케이션 로직)

webserver -> was -> db

servlet 비즈니스 로직을 제외한거 다 알아서 해줌
싱글톤, 서블릿컨테이너(객체생성초기화종료까지관리)

동시 요청 - 멀티 쓰레드
쓰레드 생성 비용 너무 비싸, 컨텍스트 스위치 비용
쓰레드풀이 쓰레드 관리(미리생성) -> was가 알아서 해줌

http: html 주기
http api: data(json)주기, ui클라이언트(프론트), 서버to서버

html다하기 -> 서블릿(비즈니스 로직 제외한거 다해줌) -> 비즈니스 로직 혼자 너무 많음
-> mvc -> 춘추전국시대mvc -> 애노테이션 스프링 mvc

 

웹 클라이언트배달의 민족 주문이다.

web client -> ~~~/hello   <배달의 민족 주문: hello GET이요>

내장 톰캣 서버(배달의 민족)에서 controller(가게)에 전달

controller (안녕하세요~ 잠시만요 ~ hello 흠 model에 음식 담기)

return(배달 주소 여기요~) 값에 따라

View resolver(배달 기사) -> view에 배달
1. template
2. static

 


@ResponseBody있으면 api, data넘겨줌, 객체면 json 아니면 string converter로 페이지

@SpirngbootTest -> spring container켜서 test
@Transactional: test에서 끝날 때마다 초기화
@DataJpaTest: jpa관련 빈들만 로드

jpa(interface) - hibernate(구현체)
entity로 관리, entitiymanager
spring data interface만으로 CRUD 가능, 그리고 이름만으로 쿼리 짜줌


JPA 엔티티 작성
@Entity - 기본 생성자 필수, final 불가
@NoArgsConstructor: no args 기본 생성자 생성
@Table - 매핑할 테이블 지정, 지정 안하면 엔티티 이름
@Column - 컬럼 이름 안하면 기본, 자바 기본 타입은 not null 제약 조건 추가해야함


NoArgsConstructor accesslevel.protected 이유: 무분별한 객체 생성을 체크한다, private으로 안하는 이유는 프록시 기술을 쓸 때 객체를 강제로 만들어야 하는데 그러지 못하기 때문

 

정적 임포트(import static): 다른 클래스의 정적 멤버를 사용할 때 패키지 이름을 생략하고 직접 멤버를 사용하기 위해

ex) (Assertions).assertThat

 

JPA 연관관계가 너무 많으면 유지보수와 설계가 어렵기 때문에 쿼리, 커맨드로 나누는 경우가 있다.


Builder 패턴
생성자에 @Builder
가독성, 불변, 빠진거 디폴트로 넣어줌

 

DB설계는 웬만하면 ENTITY(table)를 줄이게 한다 -> embedded class(value)

 

최초로 jpa를 사용하면, 영속성 컨텍스트에 저장된다. 그 후 값을 가져오거나 변경할 땐 영속성 컨텍스트(캐시)에서 받아오고 수정한다. 그 후 트랜잭션이 종료될 때 커밋을 하게 된다. -> 우리가 알던 변경 사항 체크하고.. flush 날리고 .. db에 저장.
test의 경우 테스트 코드가 실제 db에 반영되면 안되기 때문에 rollback value = true가 default임

 

dispatcherTpye이란, client에서 요청이 들어오면 dispatcher servlet이 받기 전에 filter란 놈이 있다. url에 따라 허용한다, 혹은 utf-8로 설정을 바꾼다는 가 하는 기능을 수행한다. 아무튼 시큐리티를 사용하면 요청을 주고 받는데에 인증요청-허가 단계를 수행한다. 고객요청, 서블릿-서블릿, 오류 페이지 등. 여기서 오류 페이지란, 로직 상 오류가 있어서 오류 페이지를 내보낼 때는 굳이 인증을 거칠 필요가 없다. 그래서 dispatcherType이 사용된다. 시큐리티6부터는 서블릿-서블릿에도 인증이 필요해서 인증단계를 다 허용시킨다. dispatcherTypeMatchers(DispatcherType.FORWARD).permitAll()

728x90