[2023.12.21] 개발자 교육 64일 차 : 강의-Spring Boot 실습 [구디 아카데미]

DaramGee·2023년 12월 21일
0

복습

프로젝트 분석

  • 구조

  • 자바소스 : com.example.demo
  • 스프링부트 스타터 : 의존관계 처리 + 의존전이까지 자동화!(연관있는 패키지 자동연결)
  • @Configuration - 클래스 앞에 붙여서 Application Context 컴테이너에서 서버기동시 스캔 및 이른 생성
  • 만약, BeanCreationException 에러 발생 시 해당 어노테이션이 붙은 클래스를 확인해야 함!
  • @Bean - 메소드 앞에 붙여서 Bean에 등록
  • mapper : 쿼리문 저장.xml
  • DatabaseConfiguration.java : 공통코드

DatabaseConfiguration.java(공통코드) 소스리뷰

  • Dao와 Database의 연결을 일 양을 줄여주는 myBatis?

  • Dao 클래스에 DB연결과 관련된 직접적 코드 전개는 없음. 이것은 공통 코드에 작성됨.

  • 쿼리문은 mapper의 xml에 저장.

  • 그렇다면 왜 Dao클래스에 @Autowired SqlSessionTemplate이 있었을까??

  • DatabaseConfiguration.java를 확인해보자

  • DatabaseConfiguration.java

  • 각 메소드별 리턴이 생성자 호출 -> 그 상위 클래스의 상위 클래스 생성자가 먼저 호출된다는 것이 중요한 포인트임

  • DatabaseConfiguration.java에 있는 공통 코드를 통해 연동한다(이름 생성) => Application Context에 생성하여 스프링이 이름이나, 타입으로 생성하여 관리(@Configuration)

    • byName : getBean("noticeController")
    • byType : getBean(NoticeController.class)
    • 그 속에 SqlSessionFactory에 대해 명시하고 이것을 Bean으로 등록한다(@Bean)
  • hikariConfig()

  • yml의 hikari 정보를 읽어서 DB의 url, user 정보, 커밋 등 내용을 dataSource에 넘겨줌(DB 환경설정 정보)

  • 이 dataSource를 통해 쿼리문 처리 가능해짐

  • dataSource()
    - 데이터 소스를 생성하기 위해 나는 오라클 서버 정보가 필요함.
    - 그 값을 갖고 있는 hikari 객체를 파라미터로 넣어서 환경설정 정보를 얻어 커넥션을 맺는데 사용

  • 기존과의 큰 차이점은 javax.sql.DataSource는 원격에 있는 객체를 호출할 수 있는 API에 있음.

  • sqlsessionFactory()
    - 커넥션에 대한 정보 담김.

  • sqlSessionTemplate()
    - 데이터 소스, 커넥션까지 담긴 정보가 담아져 있음.
    - 따라서 Dao에서 데이터가 담겨있는 DB를 연결하는 용으로 이 메소드를 사용하게 된다.


CorsConfiguraion.java 소스리뷰

  • addCorsMappings(CorsRegistry registry)

  • 이종 언어와의 결합시 발생할 수 있는 Cors 에러를 방지하는 클래스(Front와 Back의 만남을 지원)
  • 어떻게? 두 url에 대해 매핑을 더함. (백 : 8000, 프론트(예 : 리액트) : 3000)
  • 매핑이란?(스프링은 4번 기본매핑을 디폴트로 사용)
    ✅ url에 따라 경로를 매칭하는 방법은 아래와 같이 네 가지의 방식이 있음.

매핑 패턴 소개 - React Router사용하는 컨셉
아래 번호는 순번을 의미하므로 1번을 따져서 없으면 2번이 또 없으면 3번이 적용됨

  1. exact mapping - /basic/hello.do -> http://localhost/basic/hello.do

  2. path mapping - /basic/* ->
    -> http://localhost/basic/hello.do
    -> http://localhost/basic/hello
    -> http://localhost/basic/
    -> http://localhost/basic/test

  3. extension mapping - .do, .gd
    :확장자가 do로 끝나기만 한다면 내가 가로챌께
    -> http://localhost/basic/hello.do
    -> http://localhost/basic/login.do
    -> http://localhost/basic/logout.do

  4. default mapping - / - spring legacy 기본
    :위에서 부터 따져보다가 어디에도 해당되지 않으면 디폴트가 적용됨
    -> http://localhost/basic/hello.do
    -> http://localhost/basic/hello
    -> http://localhost/basic/
    -> http://localhost/basic/test


[[JSON]](Frong - Back의 만남에 필요한 부분 복습)

  • JSON.stringify()

  • 객체를 Json 문자열로 반환

  • 외부 API 연동시 반드시 필요한 메소드

  • JSON.stringify(value[, replacer[, space]])

  • JSON.parse()

  • JSON 문자열을 분석하여 객체를 생성

  • JSON.parse(JSON.stringify(data))

  • 백엔드에서 처리된 결과를 받아오는 장면에서 사용됨.

  • Array 형태로 처리됨.(배열은 객체다.)


강의 내용

[[RestFul]] 실습 with postman

  • get 방식
    - 주소에 데이터 담아 보내기
    - 데이터 형태 Key = value

  • post 방식
    - body에 담아 보내기
    - form태그 요청은 get요청과 Post 요청만 가능
    - put, delete는 자바스크립트로 요청함.(단, 테스트 번거로움)
    - 통일 : 자바스크립트로 ajax로 요청 + 데이터는 json으로 통일하기

  • 리액트 사용시(템플릿 엔진)
    - js로 요청하는 것 필요(ajax, fetch)
    - 리액트(axios)비동기 처리 지원 api & @RequestBody
    - 자바스크립트는 기본적으로 동기가 기본상태이기 때문에 비동기 처리 필요 (예 : setTimeout)
    - 자바스크립트에서 {}로 묶여 있으면 오브젝트이다.


스프링 컨트롤러의 파싱

  • 전략1

  • 스프링 컨트롤러는 key=value 데이터를 자동으로 파싱하여 변수에 담아준다.

  • 가령 get요청은 key=value이고 post요청 중 x-www-form-urlencoded (form태그를 만들어서 데이터 전송) 시에도 key=value 이기 때문에 @RequestParam으로 받아올 수 있다.

PostMapping("/home")
public String home(@RequestParam String username, @ReqestParam String email){	
    return "home";  //@Controller home.jsp로 발생
}
  • 전략 2

  • 스프링은 key=value 형태의 데이터를 오브젝트로 파싱해서 받아주는 역할도 한다.

  • 이때 주의 할점은 setter가 없으면 key=value 데이터를 스프링이 파싱해서 넣어주지 못한다.

  • key=value가 아닌 데이터는 어떻게?

  • json 데이터나 일반 text데이터는 스프링 컨트롤러에서 받기 위해서는 @RequestBody 어노테이션이 필요

  • 그래서 @RequestBody 어노테이션을 붙이면 MessageConverter 클래스를 구현한 Jackson 라이브러리가 발동하면서 json 데이터를 자바 오브젝트로 파싱하여 받아준다.

  • form 태그로 json데이터 요청방법

  • key=value 데이터가 아니라 json데이터를 어떻게 전송할 수 있을까?

  • jsp에선 태그 안에서 메소드 및 페이지 표시

  • js에선 script안에서 ajax(리액트는 axios) 통하여 진행(함수 처리 성공시 설정, 실패시 설정 등)


POJO를 스프링 부트로 이관해보기(스프링 프레임워크의 핵심원리 확인 가능)

  • ActionForward -> String으로 변경

  • FrontMVC -> 필요없음 (서블릿 추가 설정 없이 객체 주입 가능) 어떻게? 스프링 프레임워크 컨테이너 사용
    - "/" 디폴트 설정
    - 객체를 미리 인스턴스화 빈 등록 & 매핑하여 사용
    - @Controller
    - @RequestMapping("/notice/*") & @GetMapping

  • 서블릿 외의 방법 등장(spring 2.0, 2.5, 3.0은 자유롭지 못 함) [[Dev/개념정리/어노테이션|어노테이션]]!!
    - 서블릿에 상속을 받는다? 제약조건, 메소드 오버라이딩, 추상클래스, 인터페이스
    - req,res로 전달 -> nope, @RequestParam 제공
    - res.sendRedirect("a.jsp") res 있어야 페이지 이동 가능 -> return "redirect:a.jsp"로 가능
    - req.getRequestDispatcher("a.jsp") & view.forward(req,res) -> return "forward:a.jsp"

  • 동적, 정적페이지 이관작업 - 주의 : 배포위치
    - 정적페이지 : resources


강의 마무리

  • 스프링 중급 과정

  • 스프링 시큐리티와 같은 부분도 추가적 학습 진행 예정

Tip, 8000 포트에러날 때...

  • 계속해서 8000번 포트를 사용중이라는 아래와 같은 에러가 뜰 때가 있다.

  • 자세한 해결방법 참고(https://adjh54.tistory.com/112)
    ![[Pasted image 20231221153739.png]]

0개의 댓글