ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링부트+JPA - 인스타그램 클론 코딩 02 - 프로젝트 기본 세팅 및 기본 개념 이해
    스프링/스프링부트+JPA - 인스타 2021. 9. 16. 14:49

    이지업 최주호 강사님 강의 참조

     

     

    01 프로젝트 기본 세팅

     

    • 아래 코드를 git으로 임포트 하기 (HTML/CSS 만 들어가 있음)
    https://github.com/codingspecialist/EaszUp-Springboot-Photogram-Start.git

     

    • 테스트

    굿!

     

     

     

     

     

    02 YML 이해하기

    • YML(YAML)은 '사람이 읽을 수 있는 데이터 직렬화 언어' 라고 불린다. XML/JSON 과 같은 사람이 읽을 수 있는 언어이지만 이 둘보다더 세팅에서 쉽고 보기 좋다는 강점이 있다.
    • 키와 밸류로 구성된 파일이고 JSON과 상위 호환이 된다는 장점이 있다
    • 공백은 반드시 '/' 혹은 스페이스 바로 구성되어야 하고 키와 밸류 사이에 공백이 존재해야함. 
    • 키와 밸류의 매핑은 ':'으로 구분 
    • 다시돌아와 YML(혹은 properties)는 스프링부트로 개발을 할 때 스프링부트 설정에 대한 사용법을 기술 해놓은 페이지라고 볼 수 있다. 그리고 그 페이지에 기술되있지 않은 것들은 작동에 오류를 일으킨다던지 하는 것
      (포트번호/컨텍스트패스/UTF-8설정/MVC 설정/DB 설정/JPA 설정 등)

     

     

     

     

     

    03 스프링부트의 핵심 컨트롤러 이해

    • 스프링부트의 핵심은 앞단에서 어떻게 컨트롤러를 나누는 가 이다. 원래 가장 기본적인 개념은 요청(REQUEST)이 오면 거기에 맞는 JAVA 파일('Front Controller.java)'이 불러지는 것인데 개수가 점점 늘어나면 하나의 컨트롤러에 엄청난 부담이 간다. 그래서 나눈것이 도메인 별로 컨트롤러를 분기화 시키는 것. 즉, 로그인/회원가입 등 사용자에 대한 요청은 'UserController.Java'가 처리하고 글쓰기/글삭제 등은 'BoardController.java'가 처리하게 하는 등의 방식이다 
    • 도메인으로 분기화 시킨 후에 각각의 요청을 어디 컨트롤러에 보내야 하는지에 대한 도움을 주는 것이 'Dispatcher'(Servlet/Request Dispatcher)
    • 스프링부트의 프레임워크는 이 디스패처/컨트롤러를 만들 필요 없이 직접 제공해 준다. 
    • 즉 스프링부트에서 컨트롤러에 대한 이해만 잘하면 개발을 잘 할 수 있다!!

     

     

     

     

     

    04 HTTP의 4가지 요청 방식

    • 요청이란 클라이언트(사용자-웹브라우저)가 서버에 요청을 한다는 것.
    • 보통 웹서버(DB)는 SELECT/INSERT/UPDATE/DELETE 요청을 받고 거기에 대해 응답을 함
    • 클라이언트가 요청하는 종류는 4가지
      GET - 데이터 요청
      POST - 데이터 전송
      PUT - 데이터 갱신
      DELETE - 데이터 삭제
    • 웹 프로세스 축약을 하면
      1) 클라이언트 요청-GET(http://ip주소/user/ssar) - 유저 'ssar'에 대한 정보 요청 (엔드포인트라 불리며 서버에 어떤 요청을 하는지 보여주는 형태)
      2) 웹 서버는 엔드포인트에 맞게 DB에 요청(SELECT)
      3) 웹 서버는 DB에 받은 데이터를 HTML/데이터 등으로 클라이언트가 파싱 가능한 형태로 돌려준다 
      4) 파싱이 가능한 이유는 GET/DELETE는 단순 요청이기때문에 데이터 없이 응답이 돌아가고 POST/PUT의 경우에는 HTTP 바디에 데이터 및 데이터 형식을 담아 요청하기때문에 거기에 맞춰 응답이 가능하므로 파싱이 된다. 

     

    04-1 HTTP 4가지 요청 실습

    • 실습 기본 세팅

    1. Spring Web -> WEB MVC 패턴의 기본적인 요소를 가지고 있고 내장형 톰켓을 컨테이너로 기본 탑재
    2. Spring Boot DevTools -> 파일변경이되면 자동 재실행하여 프로젝트 갱신

     

    • 컨트롤러 세팅
    @RestController
    public class HttpController {
    
    	@GetMapping("/get")
    	public String get() {
    		return "<h1>GET 요청</h1>";
    	}
    
    	@PostMapping("/post")
    	public String post() {
    		return "POST 요청";
    	}
    
    	@PutMapping("/put")
    	public String put() {
    		return "PUT 요청";
    	}
    
    	@DeleteMapping("/delete")
    	public String delete() {
    		return "DELETE 요청";
    	}
    }
    • @RestController는 데이터 응답 및 return의 문자열 응답
    • @Controller를 붙이면 return에 적은 파일 형태로 응답
    • @.....Mapping을 통해 요청 주소를 정의 → "http://localhost:8080/get"

     

    • 테스트
      굿!
      중요포인트 - 웹브라우저에서는 GET요청 밖에 되질 않는다. 포스트맨으로 뿌려보자

    굿!

     

     

    05 - 쿼리스트링/주소 변수 매핑(path variable)

    • 구체적인 데이터 요청시에 쿼리스트링 혹은 주소변수매핑이 필요하다
    • 둘다 HTTP 프로토콜 기반으로 되어있고 주소 맨 뒷 부분에 구체적 데이터를 표시한다 
      (쿼리스트링 → '8080?name=ssar' / 주소변수매핑 → '8080/ssar')

     

    • 테스트 - 컨트롤러 세팅
    @RestController
    public class QueryPathController {
    	
    	@GetMapping("/name")
    	public String nameQuery(String name) {
    		return name+" 요청(쿼리스트링)";
    	}
    	
    	@GetMapping("/name/{name}")
    	public String namePath(@PathVariable String name) {
    		return name+" 요청(주소변수매핑)";
    	}
    }

    굿!

    • 주소변수매핑방식이 가독성면에서나 개발자의 실수를 줄이는 면에서나 훨씬 편하다

     

     

     

     

     

    06 HTTP 바디 분석

    • HTTP 바디를 보기전 HTTP 헤더부분의 Content-Type을 이해할 필요가 있다. 

    • 헤더는 요청/응답에 대한 정보를 담고 있다. 즉 어떤 종료의 요청이며 어떤 데이터 형식으로 요청이 오는지 나와있고 거기에 맞게 응답을 HTTP 바디에 넣어 해주면 되는 것
    • POST/PUT요청시에 헤더에 컨텐트 타입이 프로토콜 규약으로 반드시 표시되어야함
    • 스프링 부트는 기본적으로 'x-www-form-urlencoded' 타입 (키=밸류)로 되어있는 데이터타입을 파싱(분석) 해준다
    • 많이 쓰이는 방식들은 x-www-form, text/plain, application/json

     

    • 실습 - 컨트롤러 세팅
    @RestController
    public class HttpBodyController {
    	
    	private static final Logger log = LoggerFactory.getLogger(HttpBodyController.class);
    
    	@PostMapping("/body1")
    	public String xwwwformurlEncoded(String username) {
    		log.info(username);
    		return "key=value 형식의 데이터 요청옴";
    	}
    	
    	@PostMapping("/body2")
    	public String plainText(@RequestBody String data) {
    		log.info(data);
    		return "단순 텍스트 형식의 데이터 요청옴";
    	}
    	
    	@PostMapping("/body3")
    	public String applicationJson(@RequestBody String data) {
    		log.info(data);
    		return "JSON 형식의 데이터 요청옴";
    	}
    }
    • 기본전략 xwwwform 형태는 아무것도 안붙이고 파라미터만 넣어주면 알아서 파싱을 해주고, 나머지는 @RequestBody라는 데이터 받기용 어노테이션을 붙여야 데이터가 넘어온다. 
    • @RequestBody - 클라이언트가 보내는 HTTP 요청 본문(JSON 및 XML 등)을 Java 오브젝트로 변환하는 것

     

    • 스프링부트의 기본적략으로 인해 변수명을 똑같이 맞추면 알아서 파싱을 해준다

     

    • 다른 방식들

     

     

     

    • 하지만 통상 JSON을 많이쓰고 데이터가 넘어온 형태는 JSON 전체형태로 넘어왔기때문에 다르게 받아 보자
    • 데이터의 필요한 값만 받기 위한 데이터용 클래스
    public class User {
    	
    	private String username;
    
    	public String getUsername() {
    		return username;
    	}
    
    	public void setUsername(String username) {
    		this.username = username;
    	}
    }
    • 컨트롤러 수정
    	@PostMapping("/body4")
    	public String applicationJson2(@RequestBody User user) {
    		log.info(user.getUsername());
    		return "JSON 형식의 데이터 요청옴";
    	}

    굿!

     

    • @RequestBody의 역할이 크다 알아서 JSON → 자바 오브젝트로 파싱해준다. 

     

     

     

Designed by Tistory.