Spring 입문 강의 섹션 0 ~ 섹션 3
동아리에서 사실 이전에 스프링 프로젝트는 했었지만, 기본기 다질 겸 입문 강의부터 듣고 있는 중이다.
그래도 프로젝트 해보니까 강의 들으면서 이게 이런거였군~ 하고 깨달을 수 있는 것 같다. 간단하게 강의 들으면서 기록해둔 내용 복습겸 정리하는 포스팅.
✅ Spring Boot Starter

필요한 프로젝트, 언어, java 버전, 옆에가 잘렸는데 라이브러리 등도 지정이 가능하다. 그리고 generate 누르면 필요한 프로젝트의 초기 설정들을 만들어주는 유용한 사이트. 저번에 프로젝트 할 때도 사용했었다.
Spring Boot 버전은 Snapshot은 아직 만들고 있는 것, M어쩌구는 정식 릴리즈가 아직 안 된 것이니 아무런 영어가 안붙은 버전으로 선택했다.
✅ Maven vs Gradle
두 가지다 스프링에서 사용하는 빌드 관리 도구인데, Maven은 xml형태로, Gradle은 build.gradle이라는 파일에 필요한 라이브러리 명시해두고 이 라이프사이클까지 관리해준다.
Maven이 먼저 나왔고, Gradle이 나중에 나왔는데, 성능면에서 Gradle이 더 높아서 요즘은 거의 Gradle프로젝트를 하는 추세이다.
✅ 라이브러리들
spring-boot-starter-web : 이 안에 톰캣(웹 서버), webmvc 등이 존재
spring-boot-starter-thymeleaf : 타임리프 템플릿 엔진(view를 만들기 위한)
spring-boot-starter-test : 테스트 프레임워크들(assertj, junit 등)
그 외 입문 강의엔 안나왔는데 lombok 프레임워크도 거의 빠지지 않고 쓰인다.
+) tmi 웹 서버 vs WAS(Web Application Server
웹 서버
- HTTP 프로토콜을 기반으로 클라이언트의 요청을 서비스하는 기능을 담당, 정적인 컨텐츠를 WAS를 거치지 않고 바로 제공하거나, 요청을 WAS에 보내고 결과를 받아 클라이언트에 응답
WAS
- HTTP 요청을 통해 DB 조회와 같은 다양한 로직을 처리, 주로 DB서버와 같이 실행되며 동적인 컨텐츠 결과를 클라이언트에 응답
✅ 정적 컨텐츠 ? 템플릿 엔진 ? API ?
정적인 컨텐츠는 말 그대로 이미 만들어져있는 파일 그대로 쏴준다. 정적인건 변화가 없다는 뜻이니 유저의 요청에 동적으로 바뀌거나 하는 게 아닌, 이미 만들어진 파일 그대로 쏴준다.
템플릿 엔진은 아까 언급한 thymeleaf등이 있다. 여기는 js의 백틱 같이 동적으로 변수를 받아서 띄우기 가능하다. thymeleaf말고도 머스테치 등 여러개가 있다.
API는 보통 응용프로그램, 소프트웨어 등에서 데이터 주고받기 위한 프로토콜을 의미한다. 뷰 말고 @ResponseBody 어노테이션을 통해 객체를 Json객체를 변환해서 반환한다. @RequestParam 어노테이션을 통해 API 경로로 들어오는 변수를 지정할 수 있다.
* json 객체는 javascript object notation을 의미하며 name-value형태의 쌍으로 이루어져 있다. 중괄호로 표현되고 쉼표로 각 프로퍼티를 구분한다. xml보다 간단하고 직관적이라 최근 클라이언트-서버 구조로 앱웹 개발시 json을 대부분 사용한다.
* 현재까지의 강의는 아직 GetMapping밖에 사용하지 않았는데 PostMapping의 경우 요청자가 정보를 보내기 때문에 RequestBody로 클라이언트가 보내야 할 객체 형식 등도 정해둘 수 있다. 가령 로그인, 회원가입 등에는 필요한 아이디, 닉네임, 비밀번호 등을 객체로 만들고 RequestBody형태를 붙여주면 해당 형식의 요청이 아니면 400 Bad Request로 처리 가능.
✅ MVC
흔하게 사용되는 디자인 패턴 중에 하나로 Model - View - Controller 구조로 되어 있다.
컨트롤러와 모델은 주로 내부적인 로직을 처리하고, 뷰는 외부적인, 화면의 UI관련된 것들을 처리한다. 이들을 구분해놓는 이유는 유지보수를 용이하게 하기 위해서이다.
일반적으로 Controller, Service(핵심 비즈니스 로직), Domain(비즈니스 도메인 객체저장), Repository(DB에 저장하고 관리) 4가지 요소로 웹 어플리케이션 구조를 이룬다.
Service 쪽은 비즈니스 로직 처리쪽이라 naming이 비즈니스 용어 위주로 설계된다.
✅ Test Case
- TDD(Test Driven Develop)?
테스트가 주도하는 개발을 의미한다. 항상 실패하는 테스트 먼저 작성, 테스트가 통과하는 프로덕션 코드 작성, 테스트 통과 후 프로덕션 코드 리팩토링의 순서로 진행
- 모든 테스트는 순서가 보장되지 않기 때문에, 순서에 의존적으로 테스트를 설계하지 말 것.
- @AfterEach : 테스트 끝나고 데이터 clean해주는 등 각 테스트 실행 후 종료될 때마다 해야할 행동을 지정할 수 있는 어노테이션
- @BeforeEach : 각 테스트 실행 전에 호출, 테스트끼리 서로 영향이 없게끔 새로운 객체를 생성하거나 의존관계 등을 맺어준다.