Spring 입문 02

yuns·2022년 10월 3일
0

Spring

목록 보기
3/13
post-thumbnail

Lombok

메소드, 생성자 등을 자동생성해준다.
클래스 위에 @NoArgsConstructor(기본 생성자), @Getter 같은 annotation을 붙여 사용한다.


DTO

데이터를 다룰 때, 클래스를 건드리는 것을 막아주는 완충재 역할을 한다.

package com.sparta.week02.domain;

import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@Getter
public class CourseRequestDto {
    private String title;
    private String tutor;

    public CourseRequestDto(String title, String tutor) {
        this.title = title;
        this.tutor = tutor;
    }
}

API

api는 클라이언트와 서버 간의 약속

REST

주소에 명사, 요청 방식에 동사를 사용함으로써 의도를 명확히 드러내는 것


타임라인 서비스 만들기

설계 순서

Repository - Service - Controller 순서로 작성.
(안쪽부터 바깥쪽으로!!)

  1. 프로젝트 생성
  2. 자바11버전 설정 (project structure, setting-gradle)
  3. 패키지 생성(controller, entity, repository, service, dto)

API 설계

  • 기능 - Method - URL - Return

  • 메모 생성하기 - POST - /api/memos - Memo

  • 메모 조회하기 - GET - /api/memos - List< Memo >

  • 메모 변경하기 - PUT - /api/memos/{id} - Long

  • 메모 삭제하기 - DELETE - /api/memos/{id} - Long

return값이 Long인 이유 : 메모들을 구분하는 유일한 정보인 id값(long타입)만을 가져오면 되기 때문


Repository 만들기

  1. domain 패키지 만들고, Memo 클래스 만들기
    Timestamped 클래스를 상속받고, 각 변수는 private를 넣고, 기본 생성자와 dto 생성자를 만들어준다.
package com.sparta.week03.domain;

import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;


@Getter
@NoArgsConstructor // 기본생성자 만들기
@Entity // 테이블과 연계됨을 스프링에게 알려줌
public class Memo extends Timestamped{
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @Column(nullable = false)
    private String username;

    @Column(nullable = false)
    private String contents;

    public Memo(String username, String contents) {
        this.username = username;
        this.contents = contents;
    }

    public Memo(MemoRequestDto requestDto) {
        this.username = requestDto.getUsername();
        this.contents = requestDto.getContents();
    }
}
  1. Timestamped 클래스 만들기
@MappedSuperclass // Entity가 자동으로 컬럼으로 인식합니다.
@EntityListeners(AuditingEntityListener.class) // 생성/변경 시간을 자동으로 업데이트합니다.
public class Timestamped {

    @CreatedDate
    private LocalDateTime createdAt;

    @LastModifiedDate
    private LocalDateTime modifiedAt;
}
  1. MemoRepository 클래스 만들기
package com.sparta.week03.domain;

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface MemoRepository extends JpaRepository<Memo, Long> {
    List<Memo> findAllByOrderByModifiedAtDesc();
}
  1. MemoRequestDto 클래스 만들기
package com.sparta.week03.domain;

import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.Column;
import javax.persistence.Entity;

@Getter
@NoArgsConstructor // 기본생성자 만들기
public class MemoRequestDto {
    private String username;

    private String contents;
    
}

Service

package com.sparta.week03.service;


import com.sparta.week03.domain.Memo;
import com.sparta.week03.domain.MemoRequestDto;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;

@RequiredArgsConstructor
@Service
public class MemoService {
    private final MemoRepository memoRepository;

    @Transactional
    public Long update(Long id, MemoRequestDto requestDto) {

        Memo person1 = MemoRepository.findById(id).orElseThrow(
                () -> new IllegalArgumentException("해당 아이디가 존재하지 않습니다.")
        );
        person1.update(requestDto);
        return person1.getId();
    }
}

Memo.java에 update메소드 추가하기

public void update(MemoRequestDto requestDto) {
    this.username = requestDto.getUsername();
    this.contents = requestDto.getContents();
}

Controller

package com.sparta.week03.controller;

import com.sparta.week03.domain.Memo;
import com.sparta.week03.domain.MemoRepository;
import com.sparta.week03.domain.MemoRequestDto;
import com.sparta.week03.service.MemoService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RequiredArgsConstructor
@RestController
public class MemoController {
    private final MemoRepository memoRepository;
    private final MemoService memoService;


    // Read
    @GetMapping("/api/memos")
    public List<Memo> getMemos() {
        return memoRepository.findAllByOrderByModifiedAtDesc();
    }

    // Create
    @PostMapping("/api/memos")
    public Memo createMemo(@RequestBody MemoRequestDto requestDto) {
        Memo memo = new Memo(requestDto);
        return memoRepository.save(memo);
    }

    // Update
    @PutMapping("/api/memos/{id}")
    public Long updateMemo(@PathVariable Long id, @RequestBody MemoRequestDto  requestDto) {
        memoService.update(id,requestDto);
        return id;
    }

    // Delete
    @DeleteMapping("/api/memos/{id}")
    public Long deleteMemo(@PathVariable Long id) {
        memoRepository.deleteById(id);
        return id;
    }
}

0개의 댓글