-
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주차 과제 -ing #54
base: main
Are you sure you want to change the base?
Changes from 1 commit
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,243 @@ | ||
# DB 만들기 | ||
DB를 만드는데에 필요한 조건 | ||
- 보안 그룹: 인바운드 DB에 대한 IPv4, IPv6에 대해서 모두 허용, 아웃바운드는 모든 패킷에 대해 허용 | ||
- VPC의 서브넷은 퍼블릭이어야 함 | ||
- 외부 접근 "예"로 허용해주기 | ||
|
||
## 내가 문제를 겪고 알게된 생성 조건 | ||
- VPC에 서브넷 하나 이상 | ||
- VPC의 AZ도 두 개 이상 설정되어야 함 | ||
|
||
|
||
|
||
# Work Bench 이용해보기 | ||
AWS에서는 DB를 만들 수 있을 뿐 쿼리를 만들거나 조회하거나 등의 기능 구현이 불가능하기 때문에 MYSQL Work Bench를 사용하면 쉽게 구현할 수 있음 | ||
- 만들어둔 데이터베이스에서 Endpoint 정보 url로 복사해서 Work Bench Hostname으로 넣어주기 | ||
- Username도 DB 생성시 입력했던 admin으로 작성해줌 | ||
- 비밀번호도... 하지만 비밀번호는 비밀 | ||
- 그럼 연결 가능! => 여기까지해서 연결에 성공했따! | ||
|
||
https://drive.google.com/file/d/15AuzyEhEZW4q4mcXf3P5i2NpHbdb5UDB/view?usp=drive_link | ||
완성된 DB endpoint 주소 확인 | ||
|
||
https://drive.google.com/file/d/1OkDSlp19VrPOghYihgM_Jc9SUtSvEWso/view?usp=drive_link | ||
연결 조건 확인하기 | ||
|
||
https://drive.google.com/file/d/1iudLRxpwJayCjx0TNgQcxQ-iBp3a7gzG/view?usp=drive_link | ||
연결 완료된 상태 | ||
|
||
|
||
## DB 생성 + Work Bench에 연결하면서 생긴 문제 | ||
1. DB를 처음 만들어서 연결하다가 생긴 문제 | ||
- 연결하는 VPC의 서브넷이 하나 이상이어야 하고 AZ가 두 개 이상이어야 해서 원래 쓰던 VPC를 막 연결했더니 문제가 생겼다 ... | ||
- Work Bench에서 연결 자체가 불가능한 문제가 생겼다 | ||
=> 그래서 헤매이면서 계속 구글링을 하다가... 결국은 rgd 전용 VPC+서브넷+보안 그룹들 다 전용으로 만들어서 새로 데이터베이스 만들어줬음 | ||
|
||
2. DB 이름에 있는 특수기호 때문에 명령어를 넣으면서 생긴 문제 | ||
- 그런데 이 조차도 이름에 특수기호를 넣었더니 WORK BENCH 연결 후에 ... 명령어를 입력하는 과정에서 문제가 생김 -> DB에 대해서 잘 몰라서 뭐가 문제인지 구글링으로 또 헤매이다가......... | ||
|
||
3. 외부 연결을 허용하지 않아서 생긴 문제 | ||
또 다시 DB 이름을 "study112"로 만들었는데 이 과정에서 실수로 외부 연결 허용을 하지 않아서 다시 또 WORK BENCH 연결이 안 되어서 헤맸다........ | ||
|
||
어쨌거나 최종적으로 잘 만들어서 DB 생성에는 성공했다 !!! | ||
|
||
|
||
|
||
# 코드 작성하기 | ||
- 영상을 잘 들으면서... 작성했다...!!! | ||
|
||
|
||
## BookForm | ||
''' | ||
package ServerStudy6Cloud.ServerStudy6Cloud.Controller; | ||
|
||
import lombok.Getter; | ||
import lombok.Setter; | ||
|
||
@Getter | ||
@Setter | ||
public class BookForm { | ||
//책 이름, 책 좋아하는 이유 | ||
private String name; | ||
private String reason; | ||
} | ||
''' | ||
|
||
|
||
## Rds Controller | ||
''' | ||
package ServerStudy6Cloud.ServerStudy6Cloud.Controller; | ||
|
||
import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book; | ||
import ServerStudy6Cloud.ServerStudy6Cloud.Service.RdsService; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.ui.Model; | ||
import org.springframework.stereotype.Controller; | ||
import org.springframework.web.bind.annotation.GetMapping; | ||
import org.springframework.web.bind.annotation.PostMapping; | ||
import org.springframework.web.bind.annotation.RestController; | ||
|
||
@Controller | ||
@RequiredArgsConstructor | ||
public class RdsController { | ||
private final RdsService rdsService = null; | ||
//AWS RDS에서 Book list를 가져오는 GetMapping | ||
|
||
@GetMapping("/") | ||
public String readDB(Model model) { | ||
model.addAttribute("bookForm", new BookForm()); | ||
//bookForm에 만들어둔 객체를 넘겨줌 | ||
model.addAttribute("books", rdsService.findBooks()); | ||
return "index"; | ||
} | ||
|
||
//AWS RDS에 Book 객체를 저장하는 PostMapping | ||
@PostMapping("/upload") | ||
public String updateDB(BookForm form) { | ||
Book book = new Book(); //DB에 저장해야 하는 그 자체는 Book이므로 | ||
book.setName(form.getName()); | ||
book.setReason(form.getReason()); | ||
rdsService.saveBook(book); | ||
|
||
return "redirect:/"; //root로 redirect | ||
} | ||
} | ||
''' | ||
|
||
|
||
## repository | ||
''' | ||
package ServerStudy6Cloud.ServerStudy6Cloud.Repository; | ||
|
||
import ServerStudy6Cloud.ServerStudy6Cloud.Domain.Book; | ||
import jakarta.persistence.EntityManager; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Repository; | ||
|
||
@Repository | ||
@RequiredArgsConstructor //field에 대해서 자동으로 생성자를 만들어주는 annotation | ||
public class RdsRepository { | ||
private final EntityManager em; | ||
|
||
//DB에 새로운 책 저장하는 메서드 | ||
public void save(Book book) { | ||
em.persist(book); | ||
} | ||
|
||
//DB에서 모든 책 리스트 가져오는 메서드 | ||
public List<Book> findAll(){ | ||
return em.createQuery("select b from Book b", Book.class) //JPQL 쿼리와 조회활 Class | ||
.getResultList(); | ||
} | ||
} | ||
''' | ||
|
||
|
||
## Member 엔티티 작성하기 | ||
''' | ||
package ServerStudy6Cloud.ServerStudy6Cloud.Domain; | ||
|
||
import jakarta.persistence.*; | ||
import lombok.Getter; | ||
import lombok.Setter; | ||
import org.yaml.snakeyaml.events.Event; | ||
|
||
@Entity | ||
@Setter @Getter | ||
@Table(name = "book_info") | ||
|
||
public class Book { | ||
@Id | ||
@GeneratedValue | ||
@Column(name = "book_id") | ||
private Long id; | ||
|
||
private String name; //책 이름 | ||
private String reason; //해당 책을 좋아하는 이유 | ||
''' | ||
|
||
|
||
## 그런데 ... 실행이 되지 않는다 ??? | ||
1. GETTER, SETTER와 관련하여 문제가 생겼다 | ||
-> 잘 모르겠어서... 그냥 Geeter와 Setter를 직접 입력해줬다... | ||
Comment on lines
+161
to
+162
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. 윈도우에서 ctrl+alt+s를 누르면 프로젝트 설정 창으로 갈 수 있어요. |
||
2. 나는 파일을 student112로 DB를 만들었다 -> | ||
yml 파일에 있는 로그인 값을 student6 -> student112로 변경했어야 하는데 이걸 못 찾아서 connection이 되지 않았다 ... | ||
3. 그 외의 사소한 내용들 모두 chatGpt에 검색해서 고쳤다 ... | ||
|
||
그래서 1 파일 실행 외 에러에서 -> 2 파일 실행 외 에러로 고쳤고 | ||
에러가 뜨는데 걸리는 시간도 3초에서 -> 5초로 변경되었으나... | ||
여전히 실행은 되지 않고... 컴파일 되지 않는다... | ||
|
||
4. Caused by: org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [org.hibernate.dialect.MySQL5InnoDBDialect] as strategy [org.hibernate.dialect.Dialect] | ||
라는 내용의 build error가 아직도 있고... 고치지 못했다... | ||
Comment on lines
+171
to
+172
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. DB에 연결이 안되는 것 같은데요, 혹시 application.yml 파일을 올려준다면 확인해볼게요! |
||
|
||
이 문제를 해결해보기 위하여 시도해본 것 | ||
- MYSQL 삭제 후 재설치 | ||
- 모든 코드 chatGpt로 돌려보기 | ||
- 환경변수 초기화 및 추가 | ||
아직 성공한 방법은 없다... | ||
|
||
|
||
|
||
# API로 변경 | ||
## Controller 코드 수정 | ||
package ServerStudy6Cloud.ServerStudy6Cloud.Controller; | ||
|
||
import org.springframework.web.bind.annotation.*; | ||
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 java.util.List; | ||
|
||
@RestController | ||
@RequiredArgsConstructor | ||
public class RdsController { | ||
private final RdsService rdsService = null; | ||
|
||
//AWS RDS에서 Book list를 가져오는 GetMapping | ||
//View방식에서 ResponseEntity로 변경하기 | ||
@GetMapping("/") | ||
public ResponseEntity<List<Book>> readDB(Model model) { | ||
List<Book> bookList = rdsService.findBooks(); | ||
return new ResponseEntity<>(bookList, HttpStatus.OK); | ||
} | ||
|
||
//AWS RDS에 Book 객체를 저장하는 PostMapping | ||
@PostMapping("/upload") | ||
@ResponseBody | ||
public ResponseEntity<Void> updateDB(BookForm form) { | ||
|
||
/* chatgpt한테 받은 코드 | ||
if (form.getName() == null || form.getReason() == null) { | ||
return new ResponseEntity<>(HttpStatus.BAD_REQUEST); | ||
} | ||
|
||
*/ | ||
|
||
//아래는 저장 로직이므로 남겨두고 | ||
Book book = new Book(); //DB에 저장해야 하는 그 자체는 Book이므로 | ||
book.setName(form.getName()); | ||
book.setReason(form.getReason()); | ||
rdsService.saveBook(book); | ||
|
||
//rediredct에서 ResopnseEntity로 변경하기 | ||
return new ResponseEntity<>(HttpStatus.CREATED); | ||
} | ||
} | ||
|
||
핵심 포인트는 View 방식에서 ResonseEntity로 변경해주는 것 주석이 달린 내용을 위주로 내용 변경해주기 | ||
|
||
|
||
## Hostname으로 호출해보기 | ||
### get | ||
- get은 마땅한 input이 없으므로 명령어(query?)만 입력해주기 | ||
https://drive.google.com/file/d/1OkDSlp19VrPOghYihgM_Jc9SUtSvEWso/view?usp=drive_link | ||
|
||
|
||
### upload | ||
- upload는 input 형식이 있고, 그 형식이 form이므로 Body 눌러서 www-form-unlencoded 형식으로 내용 넣어주기 | ||
https://drive.google.com/file/d/1AuqFT5di4sNwdwo-lqXVoPTBp6rQlXV_/view?usp=drive_link | ||
Comment on lines
+241
to
+243
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. 지금은 form을 사용해서 www-form-unlencoded 형식으로 인코딩을 하게 되는데요, |
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.
😭 이렇게 고군분투해주셨다니...너무 수고 많으셨습니다!
RDS는 만들거나 삭제하는데 시간이 좀 걸리기 때문에, 설정을 꼼꼼하게 체크해주시는 게 좋아요!
보안 그룹과 외부 연결 허용 부분이 놓치기 쉬운 점입니다.