충남대학교 컴퓨터공학과의 "실전코딩" 강의를 필기한 내용입니다.

이 문서는 보관이 목적이고, 관리되지 않습니다. 따라서 잘못된 정보가 포함되어 있거나 순서가 뒤죽박죽일 수 있습니다.

Spring boot starter

  • spring initializr라고 구글에 치면 스프링 프로젝트를 다운받을 수 있는 창이 뜬다
  • 여기서 뭐 자바 버전 몇을 쓸건지, 메이븐/그래들 중에 뭘 쓸건지, dependency는 뭐를 쓸건지 등등을 결정해서 다운받으면
  • 이런것들이 다 적용되어서 패키지가 하나 다운받아지는데 여기다가 자기가 원하는 api를 구축한다든지 그런걸 해주면 된다
  • 뷔페마냥 내가 원하는걸 고르면 기본세팅을 다 해서 프로젝트를 만들어주는 사이트

로그지

  • 로그지를 외부 파일로 분리하는것은 아주 중요한 일이다 : 보통 서버가 돌아갈때는 저렇게 ide상에서 실행시키는게 아니기 때문에 로그 내역을 얻다 저장해주지 않으면 볼 수 없거나 날라가기 쉽상이다
  • 뭔가 문제가 생겼을떄 로그지를 보고서 뭐가 문제인지 파악을 해야 하기 때문에 로그지를 별도의 파일로 분리하는게 중요하다는 것

로그지 읽기

  • TRACE → DEBUG → INFO → WARN → ERROR 순으로 계층이 이루어져 있는데 - 뭐 중요도 순서겠지
  • 로그를 보면 INFO 18647 - - - 뭐 이런식으로 되어있을 거다
  • 이말은 지금 INFO 이하의 내용은 출력을 안하고 있다는 얘기인거임 - TRACE나 DEBUG의 내용이 있을텐제 로그에는 출력이 되고있지 않으므로
  • WARN, ERROR가 발생하면 이제 저 INFO가 WARN이나 ERROR로 바뀌며 문구를 출력해주겟지

내가 원하는 놈 추적해서 로그지에 쓰기

  • 내가 원하는 놈을 추적하고 싶을때는 추적을 원하는 클래스에 @Slf4j 를 붙이고
  • [log.info](http://log.info/)**(“~~~”)** 를 통해 문구를 출력한다
  • 포매팅하고싶을때는 %d, %s같은거 대신 {} 를 쓰면 자동으로 포매팅이 된다

스프링 프로젝트의 구성

  • 스프링도 MVC모델처럼 기능별로 패키지를 나눠서 구현한다
  • 컨트롤러 패키지 : 프론트와의 소통 창구
  • 서비스 : 실질적인 작업이 이루어지는 곳 - 로지컬한 작업은 다 여기서 한다
  • 레포지토리 : DB와의 소통 창구
  • API : 외부서버와의 소통 창구 - 외부 서버의 api를 처리하기 위한 곳
  • 도메인 : api통신할때 주고받는 json파일이랑 대응되는 클래스들을 정의하는 곳 - json파일을 담는 그릇 클래스들을 선언하는 곳이라고 생각하면 된다
  • 콘피그 : 설정

CRUD시스템을 위한 HTTP 메소드

  • C : HTTP 프로토콜에서는 POST라는 메소드를 사용
  • R : GET이라는 메소드를 사용
  • U : PUT - 덮어쓰기 방식의 업데이트, PATCH - 기존꺼 수정하는 방식으로 업데이트
  • D : DELETE라는 메소드를 사용

인자 전달법의 종류와 url표기

  • Request body : 여기서 body == json이라고 생각하면 된다. 즉, json파일을 통째로 넘기는 방식이다. 얘는 url에 리소스만 표시한다 - /resource
  • Request param : 얘는 json파일을 전달하는게 아니라 json파일의 한 변수값만 넘기는 방식이다. url은 /resource?variable=value형식으로 적는다
  • Path variable : 얘도 변수값만 넘기는데 url을 resource value이런식으로 적는다는 차이점이 있다
  • 여기서 주의할 점은 이 방법들과 url표기는 필요충분조건이 아니라는거다 - 해당 방법을 사용하면 해당 url표기를 따라야 되지만 url표기가 그렇다고 해서 해당 방법을 무조건 쓰는것은 또 아니라 이거다

HTTP메소드들의 인자 전달법

POST

  • 얘는 무조건 json파일이 필요하므로 request body방식으로 인자를 전달받는다

GET

  • 특정 json을 조회하기 위해 특정 변수의 값을 인자로 받아야 될 필요가 있으므로 request param방식이나 path variable방식을 쓰면 된다
  • body로도 특정 변수의 값을 받을 수는 있지만 보통 GET의 경우에는 request body를 쓰지 않는다

PUT, PATCH

  • 얘는 request bodypath variable을 쓴다.
  • 근데 request param방식을 왜 안쓰는지는 잘 모르겠음

DELETE

  • 얘도 조회 후 삭제를 하므로 request param이나 path variable을 사용한다
  • GET과 마찬가지로 보통 request body는 사용하지 않는다

DB 연동하기

  • 디펜던시를 통해 DB와 프로젝트를 연결해주는 클래스를 넣어줄 수 있다
  • spring-boot-starter-data-jdbc 에 들어있는 JDBCTemplate 을 통해 SQL형 데이터베이스의 튜플들을 자바 클래스로 매핑시켜줄 수 있고
  • spring-boot-starter-data-mongodb 에 들어있는 MongoTemplate 를 통해 non-SQL인 mongoDB의 개체를 자바 클래스로 매핑해줄 수 있다
  • spring-boot-starter-webRestTemplate 를 통해 외부서버와 통신할때 Rest api들을 자바 클래스로 매핑해줄 수도 있다

디펜던시 추가하기

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

MongoTemplate 사용하기

  • 먼저 repository패키지를 만들어서 사용할 클래스를 하나 만들어준다
  • 그리고 거기에다가는 필드에 MongoTemplate를 넣어주고 @Autowired한다
  • 그리고 이놈을 사용할 서비스 클래스에 방금 만든 레포클래스를 필드에 넣어주고 @Autowired한다
  • 그리고 레포클래스에 db에 접근할 메소드들을 만들어주면 끝

CRUD 구축하기

  • POST : insert계열메소드 쓰면 된다

  • GET : find계열메소드 쓰면 된다

  • PATCH, PUT : update계열메소드 쓰면 된다

    • update계열 메소드를 쓸때는 Update객체가 필요하다
    Update update = new Update();
    update.set("key", "value");
  • DELETE : REMOVE계열메소드 쓰면 된다

질의문 작성하기

  • Criteria클래스 : 기준. 어떤 키:벨류값을 가지고 있는 도큐먼트를 검색할건지

    Criteria criteria = new Criteria("key");
    criteria.is("value");
    /*이런식으로 and(key)메소드를 활용해 여러 키:벨류를 활용할 수도 있음*/
    criteria.is("value").and("key2").is("value2");
  • Query클래스 : Criteria객체를 질의문으로 만들어주는 놈

    Query query = new Query(criteria);