본문 바로가기

항해99

23.09.10 항해 99 16기 주특기 Spring 15일차

오늘 공부한 것

* 목요일 주간 시험 다시 풀어보기

* ORM, SQL, MVC 란?

 

오늘은 일요일!!  공식적으로는 쉬는 날이었지만

목요일에 시험을 폭망한거 때문에 다시 풀어보기로 했다.

 

문제1 회원 테이블이 완성되어 있지 않습니다. .http 파일의 Q1. 회원가입 API에 따라 테이블을 작성해 주세요.

           entity 패키지의 member 클래스를 완성해 주세요.

           Entity 패키지중 Member 클래스를 변경하면 되는 것이었다

           필요한 부분인 email, password, address, phoneNumber, nicname 을 추가하고           불필요한 부분은 @ManeyToMany 부분을 주석처리했다           

entity / Member
변경 전 변경 후
@Entity
@Getter
@NoArgsConstructor
public class Member {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

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

    private String email;
    private String password;
    private String address;
    private String phoneNumber;
    private String nickname;

    @ManyToOne
    private BookStore bookStore;

//    @ManyToMany
//    private List<Book> books = new ArrayList<>();
}

 

문제2 서점에 등록된 책의 가격과 재고를 수정해야 합니다. .http 파일의 Q2. 서점에 책 등록된 책 수량 수정 API

          완성해 주세요. service 패키지, TestService의 updateBook 메서드를 완성해 주세요.

 

TestService에서는 bookRepository에서 bookStoreId 와 bookid에 해당하는 책정보를 받아와서 newBook 객체에

업데이트되도록했다

service / TestService
변경 전 변경 후
    @Transactional
    public void updateBook(Book book, Long bookStoreId, Long bookId) {
        // 구현
    }
@Transactional
    public void updateBook(Book book, Long bookStoreId, Long bookId) {
        Book newBook = bookRepository.findByBookStoreIdAndId(bookStoreId, bookId);
        newBook.update(book);
    }

 

repository / BookRepository
변경 전 변경 후
public interface BookRepository extends JpaRepository<Book, Long> {
    List<Book> findByBookStoreId(Long bookStoreId);
}
public interface BookRepository extends JpaRepository<Book, Long> {
    List<Book> findByBookStoreId(Long bookStoreId);


    Book findByBookStoreIdAndId(Long bookStoreId, Long bookId);
}

 

book 에서는 TestSercive의 update 부분에 필요한 것들을 작성했다

entity / Book
변경 전 변경 후
없음 public void update(Book book) {
        this.title = book.getTitle();
        this.author = book.getAuthor();
        this.price = book.getPrice();
        this.stock = book.getStock();
    }

 

문제3 “자바의정석”책을 서울점에서 부산점으로 옮기려고 합니다. 현재 만들어진

           Q3. 부산점에 자바의 정석 책 등록 API로는 어째서인지 정보가 수정되지 않습니다. 올바르게 작동하도록 수정해

          주세요. service 패키지, TestService의 transferBook 메서드를 완성해 주세요.

 

TestController 에서는 반환값을 void에서 Book으로 바꿔줘봤다

분명 맞게 작성한거 같은데 Test페이지에서 자꾸 결과값이 안바뀌어서 코드를 수정했다

controller / TestController
변경 전 변경 후
@PostMapping("/bookstore/{bookStoreId}/book/{bookId}")
    public void transferBook(@PathVariable("bookId") Long bookId,
                             @PathVariable("bookStoreId") Long bookStoreId) {
        testService.transferBook(bookId, bookStoreId);
    }
@PostMapping("/bookstore/{bookStoreId}/book/{bookId}")
    public Book transferBook(@PathVariable("bookId") Long bookId,
                             @PathVariable("bookStoreId") Long bookStoreId) {
        return testService.transferBook(bookId, bookStoreId);
    }

 

TestController에서 반환값을 Book으로 바꿨기 때문에 동일하게 맞춰 주었다

이후 빠진 부분인 update를 사용해서 코드를 완성시켰다

service / TestService
변경 전 변경 후
public void transferBook(Long bookId, Long bookStoreId) {
        Book book = bookRepository.findById(bookId)
                .orElseThrow();
        BookStore bookStore = bookStoreRepository.findById(bookStoreId)
                .orElseThrow();
        bookStore.addBook(book);
    public Book transferBook(Long bookId, Long bookStoreId) {
        Book book = bookRepository.findById(bookId)
                .orElseThrow();
        BookStore bookStore = bookStoreRepository.findById(bookStoreId)
                .orElseThrow();
        bookStore.addBook(book);

        book.update(bookStore);
        return book;

 

book 에서는 TestSercive의 update 부분에 필요한 것들을 작성했다

entity / Book
변경 전 변경 후
 없음 public void update (BookStore bookStore){
        this.bookStore = bookStore;

 

문제4 회원 테이블과 책 테이블간 다대다 매핑이 되어 있습니다. Purchase 테이블을 중간 테이블로 설정하여 1:N, M:1 의

          관계로 바꿔 주세요.

           entity 패키지의 purchase 클래스, 연관된 클래스들을 수정해 주세요.

 

Book 과 Member는 다 대 다 관계이며 중간 테이블인 Purchase를 만들어 Book 과 Member를 관계 맺어 주었다

Purchase에서 애너테이션을 달지 않아서 Book과 Member에서 작은 오류가 있었다

entity / Book
변경 전 변경 후
없음  @OneToMany (mappedBy = "book")
    private List<Purchase> PurchaseList = new ArrayList<>();
entity / Member
변경 전 변경 후
없음 @OneToMany (mappedBy = "member")
    private List<Purchase> PurchaseList = new ArrayList<>();
entity / Purchase
변경 전 변경 후
없음 @Entity
@NoArgsConstructor
public class Purchase {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ManyToOne
    private Book book;

    @ManyToOne
    private Member member;

}

 

문제5 회원 테이블에 서점 테이블 FK 컬럼명을 Sparta_Store_Id로 바꿔주세요. 단, Member 클래스와 BookStore 클래스를

          변경시키지 않아야 합니다. entity 패키지의 member클래스를 완성해 주세요.

 

@JoinCounm 을 이요해서 FK를 설정해 주었고 name를 이용하여 FK 이름을 설정하였다

entity / Member
변경 전 변경 후
@ManyToOne
    private BookStore bookStore;
    @ManyToOne
    @JoinColumn (name = "sparta_store_id")
    private BookStore bookStore;

 

문제6 JPA에서, 기존의 정보를 수정하는 기능 작성 시 save 메서드가 필요 없는 이유와 동작 원리에 대해 서술해 주세요.

 

내 답안 

이유 : JPA의 영속성 컨텍스트와 변경감지가 있기때문에 @Transactional 애너테이션을 사용하면 필요없다
동작원리: JPA가 Entity를 조회하면 그 정보드를 영속성 컨텍스트로 로딩 -> 영속성 컨텍스트가 Entity 필드 값이 변경되면

                이를 감지 ->  트랜잭션을 커밋할때 변경된 필드값을 DB에 자동반영

 

모법답안 : 엔티티가 처음 로드 되면 로드 된 상태의 초기 상태가 스냅샷으로 영속성 컨텍스트 저장된다. 트랜잭션                  종료 시 스냅샷과 현재 상태의 엔티티 객체를 비교 (더티체킹) 하여 변경 사항을 추적하여 데이터를                  업데이트하는데 필요한 sql문을 자동으로 생성한다.

 

ORM, SQL, MVC 란?

 

1. ORM

    Object Relational Mapping 객체 관계 맵핑의 줄임말로 객체를 구현한 클래스와 데이터 테이블을 자동으로

    연결하는것을 의미한다. 클래스와 테이블은 서로가 호환가능성을 두고 만들어진것이 아니기에 불일치가 발생하는데

    이를 방지하는 것이 OMR이다 이를 통해 객체 간의 관계를 바탕으로 SQL문을 자동으로 생성하게 된다

    즉 ORM을 이용하면 따로 SQL문을 짤 필요없이 객체를 통하여 데이터 베이스 조작이 가능하다

    이러한 ORM 기술 표준으로 사용하는 인터페이스의 모음이 JPA 이다

 

2. SQL

    Structured Query Language 구조절 질의 언어 줄임말로 데이터베이스 관리 시스템 (RDBMS)의 데이터를 위해

    설계된 언어

    1) DDL 테이블이나 관계의 구조를 생성하는데 사용

    2) DCL 데이터의 사용 권한을 관리하는데 사용

    3) DML 테이블에 데이터를 검색, 삽입, 수정, 삭제 하는데 사용

 

3, MVC   

소프트웨이 디자인패턴중 하나로 소프트웨어를 구성하는 요소들을 분리함으로써 코드의 재사용과 유지보수성을

높이고  협업을 용이하게 한다   

1) Model 데이터와 비지니스 로직 담당, 데이터베이스와 연동하여 데이터를 저장하고 불러오는 등의 작업을 수행함   

2) View 사용자 인터페이스를 담당, 사용자가 보는 화면과 버튼, 폼 등을 디자인하고 구현함.   

3) Controller Model과 View 사이의 상호작용을 조정하고 제어 사용자의 입력을 받아 Model에 전달하고 결과를

     바탕으로 View를 업데이트함