Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[양동선] 6주차 과제 - complete #59

Open
wants to merge 6 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions 6주차 Server S-Day 과제/6주차 Server S-Day 과제.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
## 과정
### 1. Entity를 완성하고 test 해보기
<img width="663" alt="스크린샷 2023-12-24 오후 3 04 20" src="https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/78548833/a382738a-7483-4680-8934-0f1e0e2fc180">

- table이 생성된 것을 확인할 수 있다!
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

application.yml에서 ddl-auto: update로 전략을 설정해줘서 자동으로 테이블이 생성된답니다!


</br>

### 2. 코드 작성 (Controller 만들기)
- application.yml, RdsRepository.java, RdsService.java, BookForm.java, RdsController.java 파일 수정하기
- localhost:8080으로 확인한 화면

<img width="319" alt="스크린샷 2023-12-24 오후 5 09 01" src="https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/78548833/b2d92be2-672b-4e8a-9dc4-1a4346473163">

### 3. Controller를 API로 만들기
- Controller를 RestController로 수정
- 결과:
<img width="398" alt="스크린샷 2023-12-24 오후 5 16 47" src="https://github.com/GDSC-Ewha-5th/GDSC-Server-5th/assets/78548833/a22978a2-6a0a-4212-9db5-e18f60b31007">
- PostMan 사용 : get, post test



## 보충 (난관-해결..!)
### 쿼리란?
- query란 단어의 뜻은 문의하다, 질문하다라는 뜻이고, 이러한 문의는 요청, 즉 '데이터베이스에 정보를 요청하는 일'을 말한다. 정보를 처리하는 과정에서 query를 보내면 이에 따른 정보를 DB로부터 가져온다.
- 참고 : https://velog.io/@rgfdds98/SQL-query란-무엇일까

21 changes: 21 additions & 0 deletions 6주차 Server S-Day 과제/Book.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package ServerStudy6Cloud.ServerStudy6Cloud.Domain;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

@Entity
@Setter
@Getter
@Table(name = "book_info")
public class Book {
@Id
@GeneratedValue
@Column(name = "book_info")
private Long id;

private String name;//책 이름
private String reason;//해당 책을 좋아하는 이유
// Entity 완성
//를 입력받고 AWS rds에 저장하는 실습
}
12 changes: 12 additions & 0 deletions 6주차 Server S-Day 과제/BookForm.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package ServerStudy6Cloud.ServerStudy6Cloud.Controller;

import lombok.Getter;
import lombok.Setter;

@Getter @Setter
public class BookForm { // 폼 객체
//책 이름, 책 좋아하는 이유
private String name;
private String reason;

}
35 changes: 35 additions & 0 deletions 6주차 Server S-Day 과제/RdsController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package ServerStudy6Cloud.ServerStudy6Cloud.Controller;

import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book;
import ServerStudy6Cloud.ServerStudy6Cloud.Service.RdsService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequiredArgsConstructor
public class RdsController {
private final RdsService rdsService;
//AWS RDS에서 Book list를 가져오는 GetMapping
@GetMapping("/")
public ResponseEntity<List<Book>> readDB(){
List<Book> bookList = rdsService.findBooks();
return new ResponseEntity<>(bookList, HttpStatus.OK);
}

//AWS RDS에 Book 객체를 저장하는 PostMapping
@PostMapping("/upload") // upload라는 경로로 가면 저장
public ResponseEntity<List<Book>> updateDB(BookForm form) {
Book book = new Book();
book.setName(form.getName());
book.setReason(form.getReason());
rdsService.saveBook(book); // book 객체 넣어주고
return new ResponseEntity<>(HttpStatus.CREATED);
}
Comment on lines +26 to +34
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

지금 여기서는 BookForm을 통해서 데이터를 전송하고, Postman에서도 x-www-form-urlencoded 형식의 데이터 인코딩을 썼어요. 그런데 우리가 API를 통해서 JSON 데이터를 보내게 되면 HTTP의 Body에 해당 데이터를 담아 전송하기 때문에, updateDB(@RequestBody BookForm form)처럼 RequestBody라는 어노테이션이 필요해요.
좀 더 자세한 건 나중에 프로젝트에서 배우기로 하고, 6주차 과제 수고 많았어요:)

}
26 changes: 26 additions & 0 deletions 6주차 Server S-Day 과제/RdsRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package ServerStudy6Cloud.ServerStudy6Cloud.Repository;

import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book;
import jakarta.persistence.EntityManager;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
@RequiredArgsConstructor // final이 붙은 필드에 자동으로 생성자 만들어주는 annotation
public class RdsRepository {
private final EntityManager em; //EntityManager : 엔티티 객체와 데베 간 상호작용 관리, DB와 맵핑되려면 꼭 필요
//DB에 새로운 책 저장하는 메서드
public void save(Book book){ // 책 객체 저장 메소드
em.persist(book); // 영속상태 : 자동으로 JPA가 엔티티의 변경을 추적하고 관리할 수 있는 상태
}

//DB에서 모든 책 리스트 가져오는 메서드
public List<Book> findAll(){
// JPQL은 객체 지향적인 방식으로 데베 검색을 정의할 수 있는 쿼리 언어, 이를 생성하는 메소드
// JQL쿼리와 조회할 class : Book이라는 클래스에서 해당 쿼리를 진행
return em.createQuery("select b from Book b", Book.class)
.getResultList(); // 그 결과를 리스트로 반환
}
}
28 changes: 28 additions & 0 deletions 6주차 Server S-Day 과제/RdsService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package ServerStudy6Cloud.ServerStudy6Cloud.Service;

import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book;
import ServerStudy6Cloud.ServerStudy6Cloud.Repository.RdsRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@Service // 서비스 명시
@Transactional // JPA의 중요한 로직은 이 안에서 실행
@RequiredArgsConstructor // final이 있는 argument의 생성자를 자동 생성(롬복 제공)
public class RdsService {
//RdsRepository를 사용해 DB에 저장하는 로직
private final RdsRepository rdsRepository; // final로 해야 repo가 변경되는 문제를 막을 수 있음

@Transactional(readOnly = true)
public List<Book> findBooks(){
return rdsRepository.findAll();
}

public Long saveBook(Book book){
rdsRepository.save(book);
return book.getId(); // 값이 저장되었는지 확인하는 용도
}

}
13 changes: 13 additions & 0 deletions 6주차 Server S-Day 과제/application.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
# RDS
spring:
datasource:
url: jdbc:mysql://gdsc-rds.cn2mak2qq5zj.us-east-1.rds.amazonaws.com:3306/study6
username: admin
password: gdsccloud
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

패스워드가 깃허브에 올라가 있네요!
RDS 리소스를 아직 삭제 안하셨다면 public access 허용에 비밀번호가 업로드되어 있어서 다른 사람들도 접근 가능할 수 있어요. RDS 리소스를 지우지 않으셨다면 삭제 부탁드려요:)

driver-class-name: com.mysql.cj.jdbc.Driver
# hibernate
jpa:
show-sql: true
hibernate:
ddl-auto: update #rds에 없는 부분은 업데이트 되고, 아닌 부분은 그냥 남게 된다.
dialect: org.hibernate.dialect.MySQL8Dialect