-
Notifications
You must be signed in to change notification settings - Fork 2
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
base: main
Are you sure you want to change the base?
Changes from all commits
bf0abbc
7eaf51d
935a164
7fb0d4f
b1b914f
b62d8b4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
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이 생성된 것을 확인할 수 있다! | ||
|
||
</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란-무엇일까 | ||
|
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에 저장하는 실습 | ||
} |
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; | ||
|
||
} |
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
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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라는 어노테이션이 필요해요. |
||
} |
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(); // 그 결과를 리스트로 반환 | ||
} | ||
} |
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(); // 값이 저장되었는지 확인하는 용도 | ||
} | ||
|
||
} |
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 | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 패스워드가 깃허브에 올라가 있네요! |
||
driver-class-name: com.mysql.cj.jdbc.Driver | ||
# hibernate | ||
jpa: | ||
show-sql: true | ||
hibernate: | ||
ddl-auto: update #rds에 없는 부분은 업데이트 되고, 아닌 부분은 그냥 남게 된다. | ||
dialect: org.hibernate.dialect.MySQL8Dialect |
There was a problem hiding this comment.
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
로 전략을 설정해줘서 자동으로 테이블이 생성된답니다!