IT/개발관련도서

[스프링부트와 AWS로 혼자 구현하는 웹 서비스] 구현하며 작성한것들 - 221219

DevHam94 2022. 12. 19. 15:53

  인텔리제이, JPA, JUnit 테스트, 그레이들, 소셜 로그인, AWS 인프라로 무중단 배포까지 

 

개발 플랫폼은 인텔리제이를 사용.(스프링부트는 톰캠과 같은 별도의 외장 서버 없이 실행가능해서 스프링과 달리 무료버전으로도 개발가능) 

 

@ 책들을 보면서 구현할때 이클립스를 이용하여 쓰인책들을 보면서 인텔리제이로 구축해볼때 계속 어려움에 봉착했는데. 인텔리제이는 워크스페이스 대신 프로젝트와 모듈이 있다. (정리된 저자의 블로그 http://bit.ly/2orXeGl) 

 

Eclipse의 Workspace와 IntelliJ의 Project

최근 인프런에 강의 영상을 올리고 여러 질문을 받았습니다. 그 중에서 자주 접하는 질문이 바로 Eclipse의 Workspace가 IntelliJ의 Project가 맞는건지에 대한 질문이였습니다. (질문) 그래서 이 부분에

jojoldu.tistory.com

 

이 책에서는 gradle을 이용하여 project를 생성했다.

 

gradle프로젝트를 spring boot프로젝트로 변경해줘야한다. 

이전까지는 start.spring.io 사이트를 이용해서 spring initializer를 사용했었는데 저자는 build.gradle의 코드가 어떤역할을 하는지, 이외에 추가적인 의존성이 필요하면 어떻게 해야할지 모르는 상태가된다고 했다.(대부분 그냥 start.spring.io를 사용해서 기본틀을 구축하고 시작했는데 신선한 진행방법이다)

 

 

## 책을따라 build.gradle 세팅을 진행하면서 

gradle could not find method compile()에러가 발생했는데 gradle 7.0버전부터 compile, runtime, testCompile, testRuntime거 사라지고 implementation, runtimeOnly, testImplementation, testRuntimeOnly가 대신하게되어서 책에서 나오는 코드를 이것으로 수정해주었더니 제대로 build가 실행되었다. 

 

 

깃과 연동

intelliJ에서 share project on github로 깃허브와 연동을 해줬다. 

 

.ignore플러그인 -> marketplace에서 설치해준다. 인텔리제이 자체로는 커밋할때 제외할파일 설정을 못하므로 .ignore라는 플러그인을 설치하여 설정해줘야한다. 

 

이렇게 설정을해줘서 모든 커밋 대상에서 제외되도록 설정해줄수있다.

 

테스트코드(TDD, 단위테스트) 

레드그린사이클

TDD는 테스트가 이끄는 개발을 나타낸다. 

빨강에서 시작해 테스트를 작성 -> 테스트실패 -> 녹색 통과하는 테스트코드작성 -> 테스트 통과 -> 리팩터(수정과정) 작동하는 코드를 어떻게 발전시킬지 생각하고 -> 클린코드(읽기쉬운코드로 만든다. 참조: https://www.samsungsds.com/kr/insights/cleancode-0823.html

 

알려주신 참고자료 'TDD 실천법과 도구' https://repo.yona.io/doortts/blog/issue/1

책저자께서 절판된 책을 pdf파일로 공유해주신것 같다. 

 

단위테스트는 TDD에서 리팩토링할필요없이 단순히 테스트코드만 작성해서 테스트한다. 

 

controller test진행 그리고 passed

 

그리고 initial project는 80포트로 실행되기때문에 address already in use 에러가 발생할수있다. 그래서 cmd창을 관리자권한으로 열어서 netstat -ano를 실행해 80포트를 사용하는 프로세스의 pid를 확인하고 taskkill /f /pid 확인한번호로 종료시켜주면. 프로젝트가 정상적으로 작동하게된다. 

 

- > lombok설정후 refactor을해준다. 

test할때 assertThat() 메서드를 사용하게되면 JUnit이나 assertJ의 라이브러리를 import해야되는데 대부분 assertJ를 사용한다. 그 이유는

- 추가적인 라이브러리가 필요하지않게된다. 

- 자동완성 잘지원되서

(eclipse에서는 대부분 JUnit으로 했었는데 인텔리제이에서는 assertJ를 import해야만 테스트가 잘돌아가서 항상 궁금했었다. 추가적인 설명은 백기선님의 유튜브에서 'assertJ가 JUnit의 assertThat보다 편리한 이유'  http://bit.ly/30vm9Lg)

 

하지만 롬북 @Getter와 @RequiredArgsConstructor 어노테이션을 hellocontroller에 붙힌뒤 실행을 시키면 gradle버전오류가 발생한다. (책에서 진행된 gradle버전은 4. 대이고 현재 많은 버전을 저켜서 7. 대이다. 그래서 책을따라서 프로젝트를 진행시킬려면 버전을 gradle 4버전대로 낮춰줘야했다. 

failed 뜨던 lombok테스트가 pass되었다.

 

import할때 Matchers 같이 s가들어가는 import에 s가 빠지면 import가 안되게된다. 

손코딩으로 직접 눈으로 검증하는게 편하겠지만 많은 서비스회사가 원하고 중요한것이 테스트 코드라고 저자는 강조했다. 

 

 

-> JPA로 데이터베이스다루기 

 

'객체 모델링보다는 테이블 모델링에만 집중하고, 객체를 단순히 테이블이 맞추어 데이터 전달 역할만 하는 개발은 분명 기형적인 형태였습니다.' - spring으로 프로젝트를 진행하면서 실제로 mapper클래스를 이용해서 sql만 작성해서 해결하는 모습을 많이보면서 많은 생각이 들었었는데 저자의 의견에 공감이 많이 되었다. -> 관계형 데이터베이스를 이용해서 객체지향 프로그래밍을 하기위해 JPA가 나왔다. 

 

si회사들은 아직 spring & mybatis를 많이 사용하고, 자사솔루션을 운영하는곳은 springboot & jpa를 보통 사용하고있다고한다. 

관계형 데이터베이스의 중요함. 대부분 데이터로 처리하다보니가 코드보다 sql과같은 데이터로 관리하는게 많을수밖에없다. 

 

JPA는 인터페이스를 이것을 구현한 hibernate, eclipse, link등이 필요한데 직접사용하지는 않고. 추상화된 Spring Data JPA를 사용하여 hibernate를 사용한다. 

 

entity를 생성할때 PK(primary key)는 Long type의 auto_increment가 좋다고한다.

Entity메서드에서는 절대 setter메서드를 만들지않는다.