전체 글 439

스프링 58강. HTTP 상태 코드

[ 1XX ] 조건부 응답 "기다리세요." 서버가 바쁠 때가 있을 수 있는데 너무 오래 걸리면 상태 코드 1XX번을 던진다. [ 2XX ] 성공 통신에 성공했을 때 2XX번 코드가 뜬다. [ 3XX ] 리다이렉션 완료 "니가 요청한거 말고 다른거 줄게" [ 4XX ] 요청 오류 클라이언트가 요청을 잘못했을 때 나타나는 코드이다. 400 : 서버가 요청을 잘못했을 때 (일반적) 403 : 인증이 안됐을 때 (Forbidden) -> 인증이 필요한 요청에 세션이 없음 405 : 허용되지 않는 메서드 (잘못된 메서드 요청) [ 5XX ] 서버 오류 서버의 잘못으로 오류가 발생했을 때 나타나는 코드이다. https://ko.wikipedia.org/wiki/HTTP_%EC%83%81%ED%83%9C_%EC%BD..

Spring/Blog-V2 2022.04.01

스프링 57강. CSR 연습하기

목적 : 회원정보 페이지에 CSR 하기 1. API 컨트롤러 Json 리턴 @GetMapping("/s/api/user/{id}") public ResponseDto userInfo(@PathVariable Integer id) { User userEntity = userService.회원정보(id); return new ResponseDto(1, "성공", userEntity); } 2. API 문서 (1) GET 요청 (2) /s/api/user/아이디 (3) 인증되어있어야 함 (4) 응답 : json 데이터를 프론트에 뿌리는 것 CSR, SSR을 모두 퍼블리싱이라고 한다. 3. 자바스크립트 ajax 요청 => fetch 요청 해당 페이지가 오픈될 때 fetch가 호출되어야 하네? 4. fetch 결..

Spring/Blog-V2 2022.04.01

스프링 56강. 웹 크롤링

프로젝트를 만들다가 데이터가 필요하면 첫 번째로 API를 찾아봐야 한다. 웹 크롤링을 방지하기 위해 네이버에서 제공해주는 API가 많이 있다. 다른 사이트에서도 API를 제공해주는 곳이 있기 때문에 첫 번째로는 API를 찾아봐야 한다. API가 없다면 실제 사이트에 검색을 해서 데이터를 찾아본다. 최초 URL 주소에는 모든 데이터들이 다운로드 되어있지 않은 페이지가 있을 수 있다. 이런 페이지는 fetch로 다운 받아서 CSR 그림을 그린다. 내가 최초 URL로 데이터를 받으려고 하면 그 사이트가 fetch로 다운 받은 데이터까지 나오지 않는 것이다. 이때 CSR로 그려진 데이터까지 다운 받기 위해서는 두 가지 방법이 있다. 첫째. wait 사용 해당 사이트가 fetch 다운로드가 다 끝나지 않았기 때문..

Spring/Blog-V2 2022.03.31

스프링 55강. 범용 고유 식별자 UUID

같은 파일을 두 번 전송하면 덮어씌워진다. 파일명도 동일해지면 안 된다. UUID 사용 UUID를 테스트하기 위해 테스트 폴더 아래 파일을 하나 만들어준다. 원래 폴더는 main을 실행하면 서버가 실행되어 오래 걸리기 때문에 테스트할 때는 따로 빼서 해주자. package site.metacoding.fileupload; import java.util.UUID; import org.junit.jupiter.api.Test; public class UUIDTest { public void 유유아이디_연습() { UUID uuid = UUID.randomUUID(); System.out.println(uuid.toString()); } } 결국 유유아이디_연습 메서드를 호출하려면 main이 실행되어야 하는데..

Spring/Blog-V2 2022.03.31

스프링 54강. multipart/form-data

파일 업로드를 위한 샘플 코드를 만들어볼 것이다. 프로젝트 생성하는 과정이 이전과 조금 다르다. H2 데이터베이스는 임시 데이터베이스라고 보면 된다. 연습용으로 많이 사용된다. in-memoory 데이터베이스라고 해서 데이터가 메모리 형태로 들어가서 하드에 기록이 되지 않는다. server: port: 8080 servlet: encoding: charset: utf-8 spring: datasource: url: jdbc:h2:mem:test driver-class-name: org.h2.Driver username: sa password: h2: console: enabled: true jpa: open-in-view: true hibernate: ddl-auto: create # create, up..

Spring/Blog-V2 2022.03.31

스프링 53강. 양방향 매핑

연관관계 유저 - 코멘트 - 게시글 Post 1 : N Comment N : 1 User 우리 홈페이지에서 댓글만 보는 페이지는 없다. 게시글 상세보기 할 때 댓글이 나오지. 만약 관리자 페이지를 만들어서 모든 댓글을 봐야 할 때는 만들 수 있지만 댓글만 보는 페이지는 없다. Post를 SELECT 하는데 Comment를 가지고 올 수 없을 때 역방향 매핑을 해줘야 한다. @OneToMany 기본전략 LAZY 메인 페이지에서는 Post의 타이틀만 가져오는데 comment까지 다 가져오면 낭비가 너무 심하다. Onetomany는 Lazy가 좋다! 스프링 기본전략 : 조인할 때 리스트 타입이 리턴되면 기본적으로 LAZY전략 사용 getter 호출될 때 조인 DB에 칼럼 만들지 말라고 알려줘야 한다. mapp..

Spring/Blog-V2 2022.03.31

스프링 52강. 필터(Filter)와 인터셉터(Interceptor)

스프링 컨테이너와 톰캣은 서로 다른 세상이다. 정확히 말하면 톰캣이 스프링을 감싸고 있다. 웹서버가 먼저 돌아야지! 외부에서 요청이 들어왔을 때 제일 처음 타는 게 web.xml = 문지기이다. 8080으로 들어와야 문지기를 만날 수 있다. 문지기는 톰캣이 만들어준 request와 response를 DS에게 전달한다. DB, 세션은 스프링 컨테이너에 들어와야 생긴다. 필터는 톰캣이 만들어주는 것이고 web.xml에서 제어할 수 있다. 인증 체크는 필터에서 할 수 있다. 로그인 되었는지는 세션 값만 체크하면 되는데 세션은 톰캣이 만들어주니까 체크가 가능하다. 권한 체크는 할 수 없다. DB에 접근하여 세션에 있는 값과 DB의 값을 비교해야 하는데 필터는 DB 커넥션 객체가 생성되기 이전에 거치는 곳이기 때..

Spring/Blog-V2 2022.03.28

스프링 51강. mustache getter

머스태치 문법을 사용해 model에 담긴 user에 접근하면서 변수를 가져오려면 {{user.username}} 이런 식으로 사용했다. 이는 실제로 변수 username에 접근하는게 아니다. 왜냐면 실제 User 모델에 username은 private으로 선언되어 있기 때문에 외부에서 접근할 수 없기 때문이다. 머스태치 내부에서 getter를 호출해주는 것이다. 실제로 getter가 호출되는 것인지 확인하기 위해 호출될 때마다 로그를 찍으려면 롬복을 사용하지 않고 직접 getter 메서드를 만들어줘야 한다. public String getUsername() { System.out.println("getUsername() 호출됨"); return username; } 하지만 롬복을 사용하면서도 직접 get..

Spring/Blog-V2 2022.03.25

스프링 50강. throw

======= 회원정보 수정하기 ======= 회원 정보 페이지를 달라고 요청하는 거니까 주소에 /api를 붙이지 않는다. 좀 특이한 건 그냥 페이지 요청이 아니라 데이터를 넣어서 페이지 달라고 요청한다. 제일 쉬운 방법은 DB에서 id로 SELECT 해서 모델에 담으면 되는데 앱까지 같은 서버로 제공한다면 fetch를 사용해야 한다. 공통적으로!! 원래는 findById( ) 메서드를 요청하면 Optional 타입을 리턴해줘서 isPresent( )로 안에 값이 있으면 return userOp.get( ) 하고, 값이 없으면 null을 리턴하는데 null이 리턴되면 결국 머스태치에서 터지게 된다. 뷰 랜더링 할 때! null을 리턴하는 것은 위험하다. 내가 직접 강제로 Exception을 터뜨려줘야 한..

Spring/Blog-V2 2022.03.25

스프링 49강. html 태그 속성 무력화

a태그의 하이퍼링크를 지우면 로그아웃에 커서를 갖다 대면 클릭 모션도 없어지는데 #을 넣으면 커서 모양은 남아있다. 하이퍼링크를 지우면 css로 손가락 만들어줄 수도 있다. cursor:pointer; 우린 # 씁시다. 그런데 #이 하이퍼링크가 가진 고유한 속성 때문에 클릭 이벤트를 가져오지 못한다. 하이퍼링크 작동 자체를 막아야 한다. href="javascript:void(0)" 해당 태그의 고유한 속성을 무력화시키는 코드이다. a 태그의 속성은 페이지 전환인데 이걸 무력화시키는 방법이 위 코드이다. 문법은 하나도 중요하지 않고 복붙 해서 사용하자. 여기서밖에 안 쓰인다! 로그아웃은 모든 페이지에서 동작해야 하는데 user.js 파일에 자바스크립트 코드를 추가하면 post 페이지에서는 동작하지 않는다..

Spring/Blog-V2 2022.03.25