스파르타 코딩

SOLEE_DEV·2023년 3월 1일
0
post-custom-banner

1. Dependencies

  • Spring web
  • H2 Database
  • MySQL Driver
  • Lombok
  • Spring Data JPA

2. 웹의 기본개념

  • API : 하나의 "약속" 정해진 요구를 하면 정해진 답변을 주는 것!
  • 스프링의 담당 : 서버!

3. 객체 지향 프로그래밍

  • 객체지향프로그래밍 : 프로그래밍을 현실 세계에 빗대어 체계적으로 해보자는 발상
  • 클래스
    - 정보를 묶는 것!
    • 현실과 비슷한 개념(객체)을 나타내기 위한 자바의 도구
    • 멤버 변수 : 클래스 내 정보

4. RestController

  • controller (자동 응답기)
    - 클라이언트의 요청을 전달받는 코드
  • RestController
    • JSON 만을 돌려주는 것은 RestController라고 함

5. 그레이들 (Gradle)

  • js : npm
  • python : pip
  • java : mavenCentral, jcenter
    => 다운로드받고 적용하는 과정을 보다 편하게! & 빌드도 도와줌

6. 사용할 기술

  • H2 = MYSQL
  • H2는 RDBMS의 한 종류로, 서버가 켜져있는 동안에만 작동하는 RDB
  • JPA : 자바 명령어를 SQL로 변환해주는 애!
  • Repository : JPA를 작동시키는 매개체!
  • API
  • Lombok : 코드 절약 가능!
  • DTO : 현업에서 데이터를 주고받을 때 사용!

7. RDBMS

  • 컴퓨터에 정보를 저장하고 관리하는 기술
  • 성능/관리 면에서 매우 고도화된 엑셀
  • H2 : In-memory DB (서버가 작동을 멈추면 데이터가 모두 삭제! / 연습용)
  • MySQL : AWS RDS에 붙일 예정!

8. H2 웹콘솔 띄워보기

  • 스프링 디렉토리
    - main > java : 소스코드 작성
    • main > resources : 설정 파일
spring.h2.console.enabled=true
spring.datasource.url=jdbc:h2:mem:testdb

9. JPA

정의

  • SQL을 쓰지 않고 데이터를 생성, 조회, 수정, 삭제할 수 있도록 해주는 번역기!

설정

// save a few customers
repository.save(new Customers("Jack", "Bauer"));
repository.save(new Customers("Chloe", "O'Brain"));

Domain과 Repository

  • domain : entity = table
  • repository : SQL 역할

Interface란

  • JPA는 인터페이스만을 가지고 쓸 수 있음 (인터페이스로 Repository 생성!)
  • 인터페이스 : 클래스에서 멤버가 빠진, 메소드 모음집!

10. 스프링의 구조

  1. Controller
    • 가장 바깥 부분, 요청/응답을 처리함
  2. Service (컨트롤러 - Repo 사이)
    • 중간 부분, 실제 중요한 작동이 많이 일어나는 부분
  3. Repo
    • 가장 안쪽 부분, DB와 맞닿아 있음.
    • 여태 배운 녀석 (Repository, Entity)

(값 업데이트 하기)

  • Service.java
	// final: 서비스에게 꼭 필요한 녀석임을 명시
    private final CourseRepository courseRepository;
    
	// 생성자를 통해, Service 클래스를 만들 때
    // 꼭 Repository를 넣어주도록
    // 스프링에게 알려줌
    public CourseService(CourseRepository courseRepository) {
        this.courseRepository = courseRepository;
    }

    @Transactional // SQL 쿼리가 일어나야 함을 스프링에게 알려줌
    public Long update(Long id, Course course) {
        Course course1 = courseRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
        );
        course1.update(course);
        return course1.getId();
    }
  • Annotation 목록
    - @Service :
    • @Transactional : SQL 쿼리가 일어나야 함을 스프링에게 알림

(Delete 해보기)

courseRepository.deleteAll();

11. Lombok

  • Lombok : 코드를 절약하기 위한 라이브러리로, 자바 프로젝트 진행시, 필수적으로 필요한 메소드를 자동생성!

  • 단축키
    - ctrl + alt + s : 환경설정

    • shift + shift : 찾기
    • alt + enter : import 클래스
  • Annotation 목록

@Getter
@NoArgsConstructor
@RequiredArgsConstructor (service.java에서 ~Repository 전달받아야 할 때)
    // 생성자를 통해, Service 클래스를 만들 때
    // 꼭 Repository를 넣어주도록
    // 스프링에게 알려줌
    public CourseService(CourseRepository courseRepository) {
        this.courseRepository = courseRepository;
    }
    
    =
    
    @RequiredArgsConstructor

12. DTO

  • 데이터값을 변경할 때 이에 대한 매개체로 Course 클래스를 직접 사용하면 안됨!

  • 내가 아닌 다른 사람이 마음대로 변경하게 되면 시스템에 오류 날 가능성이 커짐

  • 이에 DB에 연결된 클래스는 그대로 두고 이에 대한 완충재로 활용하는 것이 DTO!

  • DTO : 해당 클래스에 대한 데이터를 그대로 물고 다니는 녀석!

package com.example.week01_hw.domain;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@RequiredArgsConstructor
public class CourseRequestDto {
    private final String title;
    private final String tutor;
}

= 꼭 필요한 녀석은 final로 선언이 되어야 함

13. API

  • API
    - 클라이언트 - 서버 간의 약속

    • 클라이언트가 서버에게 요청을 보내면, 서버가 요구사항을 처리하여 응답을 반환
  • REST 규칙
    - 주소에 명사, 요청 방식에 동사를 사용함으로써 의도를 명확히 드러냄

    • 동사 = CRUD
    • 생성 (POST), 조회 (GET), 수정 (PUT), 삭제 (DELETE)
    • 주의사항
      • 주소에 들어가는 명사들은 복수형을 사용 /courses
        • 주소에 동사는 가급적 사용하지 않음 /accounts/edit (edit => put 방식 대체)
  • 데이터 요청방식

  1. GET
  • 데이터 조회 API

    @RequiredArgsConstructor
    @RestController
    public class CourseController {
    
        private final CourseRepository courseRepository;
    
        @GetMapping("/api/courses")
        public List<Course> getCourses() {
            return courseRepository.findAll();
        }
    }
  1. POST

    • 생성 요청
    @PostMapping("/api/courses")
    public Course createCourse(@RequestBody CourseRequestDto requestDto) {
        Course course = new Course(requestDto);
    
        return courseRepository.save(course);
    }
    • 해당 메소드는 기본적으로 생성한 Course 객체를 반환함
    • @RequestBody : 요청을 받는 녀석임을 나타내주는 어노테이션
  2. PUT

    • 수정 요청
    • @PathVariable : 스프링이 알아서 필요한 값을 path에 mapping 시켜줌

14. 개념 정리

  • Controller : 자동응답기
  • Service : 업데이트를 쓰는 녀석
  • Repository : 직접 쿼리를 날리는 녀석
  • DTO : 계층 간 소통 (정보를 물고 다닐 때)

15. API 작성

  • 서비스 계층 (3계층)
  1. Controller
  2. Service
  3. Repository
  • API 설계

16. service 클래스에 꼭 필요한 annotation

  • @RequiredArgsConstructor
    : memoRepository 값을 찾아 넣어줘라~
  • @Service
    : 해당 클래스가 service 객체임을 알림
  • @Transactional
    : DB에 진짜 반영이 되어야함을 알려줌!
@RequiredArgsConstructor
@Service
public class MemoService {
    private final MemoRepository memoRepository;

    @Transactional
    public Long update(Long id, MemoRequestDto requestDto) {
        Memo memo = memoRepository.findById(id).orElseThrow(
                () -> new NullPointerException("id값 없는데용?")
        );

        memo.update(requestDto);
        return id;
    }
}
  • @RequestBody 어노테이션
    @PostMapping("/api/memos")
    public Memo createMemos(@RequestBody  MemoRequestDto requestDto) {
        Memo memo = new Memo(requestDto);
        return memoRepository.save(memo);
    }
- 날아오는 녀석을 정확이 requestDTO에 넣기 위해서는 requestBody 어노테이션이 꼭 필요!
- requestBody로 말아 넣어줘야 해!!!
profile
Front-End Developer
post-custom-banner

0개의 댓글