Spring Boot default-DB/ @Component/ scheduler / MYSQL연동 / gitIgnore /EC2 배포 (항해일지 15일차)

김형준·2022년 5월 23일
0

TIL&WIL

목록 보기
15/45
post-thumbnail
  • 마이 셀렉샵 API 명세 🔗구현코드_week04
  • 오늘은 마이셀렉샵 웹 구현을 마무리하며 웹개발의 봄 Spring을 완강했다.
  • 이를 통해 Spring Boot의 필수적인 구조에 대해 이해하고 익숙해질 수 있었다.
  • 오늘의 TIL은 4~5주차 강의 중 복기할 내용들을 위주로 작성한다.

1. 학습일지


1) Spring Boot의 Default DataBase

  • 4주차 강의를 수강하며 웹을 실행하던 중, 문득 지금 실행되는 웹이 어떤 DB를 사용하는 것인가? 에 대한 의문이 들었다.
  • 초기 환경 설정 단계에서 분명 RDBMS로 H2 DB와 MYSQL Connector를 Dependency에 추가해줬는데, 어떤 DB를 사용할지 설정은 안해줬기 때문이다.🤔
  • 물론 실행할 때마다 저장했던 정보들이 날아가는 현상을 보고 H2 DB를 사용하는구나~ 라고 짐작했다.
  • 그런데 나는 설정을 해준적이 없는데!! 스프링 부트가 이렇게 똑똑하다고??
  • 정답은 똑똑한게 맞았다....

    Spring Boot gives you defaults on all things. For example, the default database is H2. Consequently, when you want to use any other database, you must define the connection attributes in the application.properties file.
    출처: Spring 공식 문서

  • 스프링은 모든 부분에서 디폴트를 제공하는데, DB의 경우 H2를 디폴트로 제공한다고 한다. 따라서 다른 DB를 사용하려면 application.properties파일에 connection을 반드시 정의해야 한다고 한다.
  • 이후의 일이지만 5주차 강의에서 실제로 MYSQL connection 설정을 application.properties에서 해준다.
  • 똑똑한 부트..

2) 3계층 설계

  • 이전 까지는 주로 구성했던 패키지 디렉을 기준으로 models, cotroller, service를 계층으로 잘못 알고 있었다.
  • Spring Boot의 3계층은 controller, service, repository 라고 한다.
  • 3계층 구조에 대해서는 Spring Boot 개념정리에서 추 후 정리할 계획이다.
  • 🔗Spring Boot 개념정리 링크

3) service에서 생긴일..✨

  • update 메서드를 정의하는데 타입 불일치 에러가 떴다.
  • 이유는 바로 orElseThrow 예외 처리를 해주지 않아 FindById()가 null일 경우를 포함하고 있어 Optional 타입으로 리턴되었기 때문이다.
  • 예외 처리를 해준다면 찾아온 경우만을 리턴해주어 에러가 사라진다. 마술✨
  • 또 하나의 에피소드가 있었는데 4주차 과제 코드를 작성하며 있었던 일이다.
  • 현재 설정된 myprice를 업데이트 해주는 메서드를 구현해야 했는데, service를 쓰는 이유에 대해서 공부도 했으면서 controller의
    @PutMapping 메서드에서 그대로 구현해버렸다.
  • 이렇게 코드를 작성한다면 controller에 @Transactional을 붙여줘야하는데, 이는 스프링 AOP 관점에 어긋나며 작동하지도 않는다고 한다.
  • 이 부분은 스프링 AOP에 대해 공부해보며 추가적으로 정리할 예정
  • @Transactional은 @Service 계층의 메서드에 붙인다는 사실을 기억하자.

4) JSONObject, JSONArray 클래스

  • Java에서 JSON을 다루기 위해 필요한 클래스
  • Spring Boot에서 사용 방법은 Maven Repo에서 Json in Java를 복사해와 build.gradle의 dependency에 추가하는 것
  • 아래 코드를 보며 이해하자
public static List<ItemDto> fromJSONtoItems(String result){
	// Java String을 Json 객체로 바꿔준다.
    JSONObject rjson = new JSONObject(result);

	// JSON 객체에서 JSON 배열(대괄호)을 꺼내준다.
	JSONArray items = rjson.getJSONArray("items");

	// for문 돌며 JSON객체로 뽑아오기
	List<ItemDto> itemDtoList = new ArrayList<>();
	for(int i=0; i<items.length(); i++){
		//JSONArray에 담겨있는 JsonObject를 가져오겠다.
		JSONObject itemJson = items.getJSONObject(i);
		ItemDto itemDto = new ItemDto(itemJson);
		itemDtoList.add(itemDto);
	}
	return itemDtoList;
}

5) @Component

  • Spring Boot의 auto-configuration은 ComponentScan을 통해 컴포넌트를 찾아 Bean으로 생성한 뒤 추가적인 Bean들을 함께 생성해준다. 🔗출처
  • 우리가 스프링 부트 app을 실행하는 메인함수가 담긴 클래스에는 @SpringBootApplication이 선언되어있다.
  • @SpringBootApplication 안에는 아래와 같은 어노테이션이 담겨있다.
    • @SpringBootConfiguration
    • @ComponentScan
    • @EnableAutoConfiguration
  • 그 중 @ComponentScan 에서 @Controller, @RestController, @Service, @Repository, @Configuration에 등록한 @Bean 들을 자동으로 생성해준다.
  • 이 부분 역시 짧게 다룰 내용이 아니어서 따로 정리할 예정이다.
  • 쉽게 생각하면 스프링이 자동으로 필요한 클래스를 생성하기 위해 참고하는 리스트업에 추가해주는 어노테이션이다.
  • @Controller, @Service, @Repository는 @Component를 상속받고 있다.
  • 이어지는 개념으로 @RequiredArgsConstructor에 의해 생성되는 클래스(final붙은 class)는 컴포넌트에 등록이 안되어있으면 오류가 발생한다.

6) Spring Boot Scheduler

  • 일전에 chapter1 프로젝트에선 파이썬을 이용한 apscheduler 모듈을 사용하여 스케쥴러를 구현했는데, 오늘은 spring boot에서 스케쥴러를 구현하는 방법을 배웠다.
  • 먼저 Scheduler를 구현하는 클래스에는 @Component 어노테이션이 필수적으로 선언되어야 한다.
  • 초, 분, 시, 일, 월, 주 순서로 실행할 메서드 위에 아래 어노테이션 선언
// *은 어떤 값이든 상관 없다는 뜻.
@Scheduled(cron = "0 0 1 * * *")
  • SpringApplication.run메서드를 실행하는 메인함수 클래스에 @EnableScheduling을 선언한다.

7) AWS RDS 연동 / git ignore

  • MYSQL RDS 구매 후 application.properties에 계정 정보 작성
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://[endPoint]:3306/myselectshop
spring.datasource.username=xxxx
spring.datasource.password=xxxx
  • 이 때 주의할 점은 해당 프로젝트를 GitHub에 업로드할 때 계정정보를 git ignore에 추가해줘야 한다는 점이다!

    1. 가장 좋은 방법은 깃허브에 push하기 전에 application.properties를 git ignore에 추가하는 것이다.
      (그러나 이미 올려둔 상태라면 캐시를 지우거나, 아래와 같이 새로운 파일을 만들어 따로 저장해야 한다.)
    2. application-xxxx.properties 생성하여 민감한 정보들 넣기
    3. application.properties 에서 spring.profiles.include=xxxx 작성하여 넣어주기
    4. git ignore 파일에 application-xxxx.properties 추가해주기
  • 나중에 알게된 사실인데, 계정 정보에 더미 값을 넣고 업로드 테스트를 해봤는데 GitGuardian한테 메일 받았다. 계정정보도 올렸다고 ㅋㅋㅋㅋ 똑똑해


8) 우분투에서 spring boot 실행시키기

  1. Gradle로 build하여 jar파일 생성하기
  2. 우분투에 open JDK 설치하기
    sudo apt-get update
    sudo apt-get install openjdk-8-jdk
    java -version
  3. 파일질라를 사용하여 우분투에 생성한 jar 파일 옮기기
  4. java -jar JAR파일명.jar 입력 시 스프링부트 실행~
  5. nohup java -jar JAR파일명.jar &
  6. nohup 종료는 ps -ef | grep javakill -9 [pid값]
profile
BackEnd Developer

0개의 댓글