Web

    EP3. 서블릿객체만을 이용해 HTTP 응답 메시지 작성하기

    상태코드 헤더세팅 - content - cookie - redirect 상태코드 response.setStatus(HttpServletResponse.SC_OK); 헤더세팅 response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); response.setHeader("Pragma", "no-cache"); response.setHeader("my-header", "hello"); 헤더 세팅시 편의 메서드 content private void content(HttpServletResponse response) { //Content-Type: text/plain;charset=utf-8 //Content-Length: 2 //res..

    EP2. 서블릿객체만을 이용해 HTTP 요청데이터 처리하기

    HTTP 요청 데이터는 쿼리파라미터 HTML Form HTTP API 세가지로 나누어 진다. 쿼리파라미터 쿼리파라미터는 request.getParameterNames() 로 쉽게 받을 수 있다. RequestParamServlet.class package hello.servlet.basic.request; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java..

    [Spring] HTTP 정보 로그 남기기

    application.properties에 logging.level.org.apache.coyote.http11=debug 적어주면 된다.

    EP1. WAS, 서블릿, 멀티쓰레드

    웹서버 vs WAS 웹서버 HTTP 기반으로 동작 정적 리소스 제공(HTML, CSS, JS, 이미지, 영상), 기타 부가 기능 웹 애플리케이션 서버 (WAS) HTTP 기반으로 동작 웹 서버 기능 포함 + 애플리케이션 로직 수행 - 동적 HTML, HTTP API(JSON) - 서블릿, JSP, 스프링 MVC WAS가 웹서버 기능까지 할 수 있지만 과부하 방지를 위해 분리한다. 클라이언트 -> 웹서버 -> WAS -> DB WAS는 애플리케이션 로직만 전담하게된다. 그래서 정적 리소스가 많이 사용되면 웹서버 증설, 애플리케이션 리소스가 많이 사용되면 WAS 증설 하면된다. 서블릿 웹브라우저가 생성한 요청 HTTP 메시지와 응답 메시지를 편리하게 사용하게 도와준다. 그래서 개발자는 핵심 비즈리스 로직만 ..

    네트워크 기본지식 + HTTP API 정리

    인터넷 네트워크 IP (Internet Protocol) : 인터넷 프로토콜 1. 비연결성 2. 비신뢰성 3. 여러 애플리케이션 동시구동시 구분 위 3개의 문제때문에 TCP 등장 TCP (Transmission Control Protocol) 1. 연결지향 (3 way handshake) 2. 순서 보장 3. 신뢰성 보장 UDP (User Datagram Protocol) 1. IP와 기능이 거의 같음 2. IP + PORT 정도 요즘에는 대부분 TCP를 사용하지만 UDP가 다시 떠오르고 있다. UDP를 최적화하여 사용하려고 하고있다. PORT : 같은 IP 내에서 프로세스를 구분하게 해준다. 0 ~ 65535 : 할당가능 0 ~ 1023 : well known 포트 - FTP : 20, 21 - HTT..

    [Spring & JPA] 데이터 수정시 변경감지(dirty checking) vs merge

    JPA는 기본적으로 데이터만 바꿔도 변경감지를 통해 트랜젝션 커밋시점에 sql이 나간다. 그런데 *준영속 엔티티 일때는 변경감지가 일어나지 않는다! 그러면 준영속 엔티티 상태일때는 데이터를 어떻게 변경해야할까? 준영속 엔티티의 데이터 변경에는 두가지 방법이 있다. 변경감지기능 사용 merge 사용 변경감지기능사용 방법은 트랜잭션이 있는 서비스계층에서 데이터를 수정하는 것이다. ItemService ... @Transactional public Item updateItem(Long itemId, String name, int price, int stockQuantity) { Item findItem = itemRepository.findOne(itemId); findItem.setPrice(price); ..

    [Spring & JPA] 프로젝트시 주의해야할 점 (에러발생시 확인해야할 부분)

    Many To Many 는 사용하지마라 -> (일대다 다대일 로 풀어라) enum타입 사용시 @Enumerated(EnumType.STRING) 으로 사용해라 양방향 연관관계는 되도록 사용하지마라 @Getter는 모두열어놓으면 편하다 @Setter는 사용하지않는다. (Setter는 생성자 주입으로 풀어라) 값 타입은 변경이 되면 안되기 때문에 생성자 주입을 열고 기본생성자(protected)도 만들어주어야 한다. (new로 생성 불가) ddl로 생성되는 테이블들이 맞게 되는지 확인하고 정제하는 작업을 거쳐야 한다. 모든 연관관계( @XToOne )는 지연로딩으로 설정해라 (N+1문제 해결방법) 컬렉션을 사용할때는 private List orders = new ArrayList(); 선언과 동시에 초기화 ..

    [IntelliJ] 인텔리제이 JPA Hibernate로 Provider 지정 (빨간줄 뜨게 설정)

    File -> Project Structure Modules -> main -> JPA -> Default JPA Provider -> Hibernate

    스프링부트 쿼리 파라미터 로그로 보기

    spring: datasource: url: jdbc:h2:tcp://localhost/~/jpashop username: sa password: driver-class-name: org.h2.Driver jpa: hibernate: ddl-auto: create properties: hibernate: # show_sql: true format_sql: true logging.level: org.hibernate.SQL: debug # org.hibernate.type: trace application.yml 에서 이렇게 세팅하면 위와 같이 파라미터가 ? 로 찍힌다. 여기서 application.yml 에 org.hibernate.type: trace를 추가하면 ? 에 해당하는 파라미터가 무엇인지 찍힌..

    Gradle 인텔리제이로 실행속도 빠르게하기

    최근 IntelliJ 버전은 Gradle로 실행을 하는 것이 기본 설정이다. 이렇게 하면 실행속도가 느리다. 다음과 같이 변경하면 자바로 바로 실행해서 실행속도가 더 빠르다. Preferences -> Build, Execution, Deployment -> Build Tools -> Gradle