728x90
반응형
SMALL

step 1

책 재고가 부족하여 다음주에 책들이 새롭게 들어오기로 했습니다.

책을 서점에 등록하려고 합니다. 책(Book) 과 서점(BookStore)의 연관관계를 맺어보세요!

[요구사항]

  • 다대일 단방향 연관관계를 적용해주세요.

ERD

SQL

create table book (
       id bigint generated by default as identity,
        author varchar(255) not null,
        name varchar(255) not null,
        price integer not null,
        quantity bigint not null,
        book_store_id bigint,
        primary key (id)
    )
create table book_store (
       id bigint generated by default as identity,
        location varchar(255) not null,
        name varchar(255) not null,
        primary key (id)
    )
alter table if exists book 
       add constraint FK93giw6493l79g47q3nr7asvo1 
       foreign key (book_store_id) 
       references book_store

step1 다대일 단방향 연관관계

bookstore ← book

Book

package com.example.jpa_relation_test.entity;

import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Entity
@Getter
@NoArgsConstructor
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String author;
    @Column(nullable = false)
    private String name;
    @Column(nullable = false)
    private int price;
    @Column(nullable = false)
    private long quantity;

    @ManyToOne
    @JoinColumn(name = "BookStore_id", nullable = false)
    private BookStore bookStore;

    public void setBookStore(BookStore bookStore) {
        this.bookStore = bookStore;

		}
}

BookStore

package com.example.jpa_relation_test.entity;

import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@NoArgsConstructor
@Getter
@Entity
public class BookStore {
    @Id
    @Column(name = "BOOK_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String location;
    private String name;

}

step2 다대일 양뱡향 연관관계

bookstore ↔  book

Book

package com.example.jpa_relation_test.entity;

import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@NoArgsConstructor
public class Book {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String author;
    @Column(nullable = false)
    private String name;
    @Column(nullable = false)
    private int price;
    @Column(nullable = false)
    private long quantity;

    @OneToMany(mappedBy = "book", fetch = FetchType.EAGER)
    private List<BookStore> bookStore = new ArrayList<>();
   
    public Book(Long bookId) {
        this.id = bookId;

    }
}

BookStore

package com.example.jpa_relation_test.entity;

import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@NoArgsConstructor
@Getter
@Entity
public class BookStore {
    @Id
    //@Column(name = "BOOK_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String location;
    private String name;

    @ManyToOne
    @JoinColumn(name = "BOOK_ID")
    private Book book;

    public BookStore(String location, String name){
        this.location = location;
        this.name = name;
    }

}

step3 일대다 단방향 연관관계
Member <- bookstore ↔  book

Book

package com.example.jpa_relation_test.entity;

import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Entity
@Getter
@NoArgsConstructor
public class Book {
    @Id
    @Column(name = "BOOK_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String author;
    @Column(nullable = false)
    private String name;
    @Column(nullable = false)
    private int price;
    @Column(nullable = false)
    private long quantity;

    @ManyToOne
    @JoinColumn(name = "BookStore_id", nullable = false)
    private BookStore bookStore;

    public void setBookStore(BookStore bookStore) {
        this.bookStore = bookStore;

    }
}

BookStore

package com.example.jpa_relation_test.entity;

import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@NoArgsConstructor
@Getter
@Entity
public class BookStore {
    @Id
    //@Column(name = "BOOK_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String location;
    private String name;

    @OneToMany
    @JoinColumn(name = "Book_id")
    private List<Book> book = new ArrayList<>();
}

step4 다대다를 사용하지 말고 구현하기!
book ↔ Purchase ↔ Member <- bookstore ↔  book

Book

package com.example.jpa_relation_test.entity;

import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
@Getter
@NoArgsConstructor
public class Book {
    @Id
    @Column(name = "BOOK_ID")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false)
    private String author;
    @Column(nullable = false)
    private String name;
    @Column(nullable = false)
    private int price;
    @Column(nullable = false)
    private long quantity;

    @OneToMany
    @JoinColumn(name = "Book_id")
    private List<Book> bookStore = new ArrayList<>();
}

Member

package com.example.jpa_relation_test.entity;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany
    @JoinColumn(name = "Purchase_id")
    private List<Purchase> purchase = new ArrayList<>();
    @ManyToOne
    @JoinColumn(name = "Bookstore_id", nullable = false)
    private BookStore bookStore;

}

Purchase

package com.example.jpa_relation_test.entity;

import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;

@Entity
public class Purchase {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @OneToMany
    @JoinColumn(name = "Book_id")
    private List<Book> book = new ArrayList<>();

    @ManyToOne
    @JoinColumn(name = "Member_id", nullable = false)
    private Member member;
}
728x90
반응형
LIST
728x90
반응형
SMALL

현재 시간을 dto에서 나오게 설정했는데 왜 나오지 않을까 고민을 했습니다ㅠㅠㅠ

새로 만드는 과정하고, 수정하면서 깃허브를 조작하면서 계속 하나를 빼먹어서 몇 시간 동안 고민했습니다..

처음은 오타에서 시작해서 나중에는 아예 까먹는 수준..ㅎㅎㅎㅎ 까 먹지 않기 위해 정리!!

Application

@EnableJpaAuditing 다음에는 까먹지 말자!!

package com.example.myblog;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;

@EnableJpaAuditing		// 시간을 받아오는 어노테이션!! 까먹지 말자!!
@SpringBootApplication
public class MyblogApplication {

	public static void main(String[] args) {
		SpringApplication.run(MyblogApplication.class, args);
	}

}
728x90
반응형
LIST
728x90
반응형
SMALL

Q1. 수정, 삭제 API의 request를 어떤 방식으로 사용하셨나요? (param, query, body)

body

Q2. 어떤 상황에 어떤 방식의 request를 써야하나요?

1. GET

리소스를 검색하고, 반환받기 위해 사용되는 메소드이다.
원하는 정보를 서버에 요청할 때 쓰인다.

2. POST

요청된 자원을 생성하기 위해 사용되는 메소드이다.
POST로 정보를 전송하면 URL에 파라미터가 나타나지 않으므로 각종 데이터를 전송하는데 쓰인다.

3. PUT

요청된 자원을 수정하기 위해 사용되는 메소드이다.

4. PATCH

요청된 자원을 수정하기 위해 사용되는 메소드라는 점에서 PUT과 같지만,
해당 자원 전체를 수정하는 PUT과는 다르게 PATCH는 해당 자원의 일부 부분을 수정한다.

5. DELETE

요청한 자원을 삭제하기 위해 사용되는 메소드이다.
클라이언트에서 서버의 자원을 삭제할 수 있도록 허가하는 것은 매우 위험하다.
그러므로 현실적으로는 사용될 일이 거의 없고, 대부분의 서버는 이 메소드를 비활성화 시킨다.

Q3. RESTful한 API를 설계했나요? 어떤 부분이 그런가요? 어떤 부분이 그렇지 않나요?

1. 자원( Resource ) 을 적절하게 보냈다.

/api/post/id 와 같이 HTTP URI를 이용해 자원을 구별하여 요청하였다.
 

2. GET, POST, PUT, DELETE 와 같은 메서드를 적절하게 사용하였다.

게시글 조회, 단일 게시글 조회에 GET 사용
게시글 작성에 POST 사용
게시글 수정에 PUT 사용
게시글 삭제에 DELETE 사용
 

3. 적절한 형태의 자원을 사용하였다.

REST에서는 자원을 JSON, XML 등의 여러 형태로 나타내어 질 수 있다.
이번 과제에서는 클라이언트와 서버간에 JSON 형태로 데이터를 주고 받게 하였다.

Q4. 적절한 관심사 분리를 적용하였나요? (Controller, Repository, Service

  • BlogController : Controller에서 사용자의 요청이 어떤 것인지 확인하고, Service에게 요청에 맞는 작업을 진행하도록 코드를 작성.
  • BlogService : Service에서 Controller에서 전달받은 사용자의 요청사항에 알맞게 데이터를 가공해서 데이터베이스로 전달하거나, 데이터베이스에서 데이터를 전달받아 가공하여 유저에게 전달하게끔 코드를 작성.
  • BlogRepository : Repository 에서는 JPA를 사용하여 DB를 관리하였다.

Q5. API 명세서 작성 가이드라인을 검색하여 직접 작성한 명세서와 비교해보세요!

넹.. 이거 쓰는 것도 어렵습니다 …흑흑

728x90
반응형
LIST

+ Recent posts