스프링 공부 52

3-4. 회원 서비스 개발

컨트롤러, 서비스, 도메인, 리포지토리, DB 중에서 컨트롤러, 도메인, 리포지토리를 지금까지 배웠다. 오늘은 서비스를 만들어보는 실습이다. 리포지토리와 서비스의 차이점 리포지토리를 만들 때 새로운 회원 정보를 저장하기, 이름을 기준으로 탐색하기, ID를 기준으로 탐색하기 등 어떤 기계의 기본적인 기능을 하나하나 만들듯이 코드를 짰다면, 서비스를 만들 때는 조금 더 비즈니스와 맞닿은 형태로 만들어야 한다. 고객이 쓸 기능이 무엇무엇인가를 고민해서 그걸 구현하는 것이다! 리포지토리에서 만들었던 기본 기능들을 조각조각 합하고, 더 필요한 것이 있다면 덧붙여서 서비스를 완성한다. 준비하기 main에 service용 패키지를 만들고 그 안에 MemberService 클래스를 만든다. 회원가입 기능 만들기 먼저 ..

3-3. 회원 리포지토리 테스트 케이스 작성

저번 시간에 만든 리포지토리가 잘 돌아가나 시험해보기 위해 테스트 케이스를 작성하고 테스트를 해보는 회차이다. 준비 test > java > hello.hellospring 패키지 안에 repository라는 패키지를 새로 만들고, 그 안에 클래스를 하나 만든다. MemoryMemberRepository의 테스트케이스이므로, 관례에 따라 MemoryMemberRepository 뒤에 Test만 붙인 것을 클래스의 이름으로 사용한다. 만들어준 다음에 패키지 구성을 살펴보면 main에서 테스트의 대상이 될 MemoryMemberRepository의 위치와 우리가 방금 test 하위에 만든 MemoryMemberRepositoryTest의 위치가 쌍둥이처럼 비슷한 것을 확인할 수 있다. 테스트용 클래스는 다른..

3-2. 회원 도메인과 리포지토리 만들기

이번 강의에서는 도메인(domain)과 리포지토리(repository)를 만든다. 이것들의 역할은 직전 강의에서 배웠으니 까먹으면 돌아가서 살펴보자. 도메인용 패키지를 만들어서 그 안에 Member 클래스를 만들어준다. 그리고 리포지토리용 패키지를 만들어서 그 안에 Member 객체들을 다루는 관리 툴들을 만들어준다. 도메인 만들기 이 위치에 domain이라는 패키지를 만든다. 그리고 domain 내에 Member라는 클래스를 만든다. 클래스 내부는 이렇게 필드와 getter, setter로 간단하게 채워준다. 근데 이제 보니까 각 변수들이 클래스 안에서 몇 번 사용되었는지까지 IntelliJ가 알려준다... 정말 편리하다. 리포지토리 만들기 이번엔 domain 레포지토리와 동일한 레벨에 reposito..

3-1. 비즈니스 요구사항 정리

다음 강의부터 실제 예제를 만들어보는 과정이 시작된다. 이번 강의에서는 앞으로 만들 예제에 대해서 간단하게 설명해주셨다. 예제에 대하여 우리가 만들 프로그램은 매우 단순하다. 프로그램의 기능: 회원 등록, 조회 다룰 데이터: 회원ID, 이름 그리고 어떤 종류의 DB(데이터 저장소)를 사용할지 정해지지 않은 상황이라고 가정하고 개발을 진행할 것이다. 일반적인 웹 애플리케이션의 계층 구조 웹 애플리케이션은 일반적으로 컨트롤러, 서비스, 리포지토리, 도메인으로 구성된다고 한다. 컨트롤러: 방금 전까지 여러 번 사용했던 그 컨트롤러 서비스: 핵심 비즈니스 로직 구현 도메인: 비즈니스 도메인 객체. 회원, 주문, 쿠폰 등의 정보를 예로 들 수 있다. 주로 데이터베이스에 저장되고 관리된다. 리포지토리: 데이터베이스..

2-3. API

세 번째는 API다! 프로젝트 팀에서 API 방식으로 개발을 할 것 같아 빨리 배우고 싶었는데 드디어 처음으로 살펴보는 순간이 왔다. @ResponseBody 저번에 @GetMapping라는 참조(annotation)를 새로 배웠다면, 이번에는 @ResponseBody가 새로 등장했다. (복습: @GetMapping은 URL과 컨트롤러(함수)를 이어주는 연결고리였다.) @ResponseBody에서의 Body는 html 태그의 그 body가 아니다. HTTP 통신에서 요청과 응답을 위해 주고받는 메시지에는 헤더와 바디가 있다. 이 HTTP 응답/요청 메시지의 바디 영역에 @ResponseBody 이하의 함수가 리턴하는 값 그 자체를 넣어주겠다는 선언이 바로 @ResponseBody 참조이다. 그래서 따로 ..

2-2. MVC와 템플릿 엔진

이번에는 두 번째 스프링 웹 개발 방법인 MVC와 템플릿 엔진 사용에 대해 살펴보았다. MVC는 Model, View, Controller의 약자이다. Model은 데이터관리를 위한 모델(데이터베이스 수업시간에 배운 것) View는 화면에 무엇이 어떻게 보일 것이냐에 집중하는 부분, Controller는 데이터의 움직임 등 웹사이트 내부에서 어떤 일이 일어날 것인지를 관리하는 부분이라고 이해했다. Resolver? Converter? Resolver와 Converter라는 이름에 익숙해져야 할 듯하다! 스프링 프로젝트 내부에 있는 여러 구성요소를 뒤져서, 그 중 어떤 놈을 선택하여 결과물에 반영할지 정하고 나면 그놈을 가지고 결과물을 빚어내는 역할을 하는 것이 이 Resolver와 Converter인 것..

2-1. 정적 컨텐츠

스프링으로 웹 개발을 하는 방법에는 크게 3가지가 있다. 첫째는 단순하게 스태틱 파일로 개발하는 것, 둘째는 MVC와 템플릿 엔진을 사용하는 것, 셋째는 API를 사용하는 것이다. 가장 먼저 정적 컨텐츠에 대한 내용을 살펴보았다. 스프링이 정적 파일 (static file)을 사용하는 과정은 다음과 같다. 프로젝트의 main>resources>static 레포지토리에 static-test.html을 만들었다. 화면에 "테스트테스트"라고 뜨게 했다. 이제 main을 실행시키고 (메인 URL)/static-test.html에 접속한다. 그러면 일단 내장 톰캣 서버에서는 static-test와 관련된 컨트롤러가 있는지 스프링 컨테이너를 뒤져본다. 즉, static-test와 관련하여 만들어놓은 java 코드가..

1-4. 빌드하고 실행하기

이전 강의까지는 IntelliJ 상에서 프로젝트를 실행했다. 이번 강의에서는 IntelliJ에서가 아닌 일반적인 콘솔에서 프로그램을 빌드하고 jar 실행파일을 만든 다음 그걸 실행해보는 실습을 진행했다. 시작하기 전에, IntelliJ 상에서 프로그램이 실행되고 있지 않도록, 즉 포트가 사용되고 있지 않도록 해주어야 한다. IntelliJ 상에서 실행하든 콘솔에서 빌드한 실행파일을 이용하든 모두 8080번 포트를 사용해 서버를 열 것이다. 그런데 8080번 포트를 두 개의 프로세스가 동시에 사용하는 것은 불가능하다. IntelliJ에서 이미 8080번 포트를 점유해버리면 우리가 콘솔에서 실행파일을 만들어 실행시켜도 8080번 포트를 쓸 수가 없어서 실패하게 된다. 그러니 IntelliJ에서 프로그램을 R..

1-3. View 환경설정

이번 강의에서는 웹 앱의 기본 페이지인 Welcome Page를 만드는 두 가지 방법을 배웠다. 정적 파일 index.html를 단순히 브라우저에 넘겨주는 방식과 템플릿 엔진을 사용하여 좀 더 수준 높은 페이지 구성을 하는 방식이 있었다. 스프링에 대한 공식 웹 문서도 간단하게 살펴봤다. index.html의 정적인 사용 src>main>resources>static 안에 index.html 파일을 새로 만들어준 뒤, 화면과 같이 강사님의 코드를 따라 적는다. 강의자료에 있는 것을 복붙해도 된다. 어차피 프론트엔드가 아니라 백엔드 강의이므로 html은 가급적 복붙해서 넣으시겠다고 한다. 스프링 부트는 이렇게 static file들을 관리하는 폴더 내에 index.html이라는 이름의 파일이 있다면 자동으..

1-2. 라이브러리 살펴보기

스프링의 라이브러리에 대하여 배우는 회차이다. 감을 잡는다고 생각하고 편하게 들으라고 하셨다. 자세한 것은 해보면서 익혀가면 된다고 하심. 의존 관계(Dependencies) build.gradle 파일을 열어서 dependencies를 보면, 우리가 스프링 부트에서 지정해줬던 Thymeleaf와 web, 그리고 자동으로 땡겨와진 test 총 세 개의 라이브러리가 보인다. 그런데 왼쪽 레포지토리에서 External Library를 열어보면? 엄청나게 많은 외부 라이브러리들이 보인다. 요즘 웹 앱 하나 만드려면 기본으로 이 정도는 다 사용해야 한다고 한다. 내가 명시적으로 가져온 것은 두 가지(test까지 하면 세 가지)밖에 없는데 실제로 가져와진 External Library가 왜 이렇게 많을까? 그것은..