목차
728x90
반응형
섹션1 프로젝트 환경설정
빌드하고 실행하기
- 터미널로 프로젝트 폴더로 이동해서 ./gradlew build 입력
./gradlew build
- 이후 build 폴더 안에 libs 폴더가 생성되고 안에 jar파일이 생성됨을 확인할 수 있다. 나의 경우 hello-spring-0.0.1-SNAPSHOT.jar 파일이다 이 파일을 java -jar hello-spring-0.0.1-SNAPSHOT.jar 명령어로 실행한다
java -jar hello-spring-0.0.1-SNAPSHOT.jar
- 서버에서 배포할 경우 위 jar파일만 export 시키고 해당 파일만 위 명령어로 사용하면 된다
섹션2 스프링 웹 개발 기초
정적 컨텐츠
- 정적 컨텐츠: 서버의 요구 없이 파일을 그대로 웹브라우저로 보내는 것
- 스프링 부트는 static 폴더에 제공된 파일을 찾아서 정적 컨텐츠 기능을 자동으로 제공함.
- localhost/hello-static.html로 이동하면 내장 톰캣 서버가 요청을 받고 스프링에 넘김. 스프링은 hello-static과 매핑된 컨트롤러가 있는지 찾아봄. 없으면 resources 폴더 내에서 해당 파일을 찾고 있으면 웹브라우저에 해당 페이지를 보여줌
MVC와 템플릿 엔진
- MVC와 템플릿 엔진: jsp, html 등의 템플릿 엔진을 서버에서 프로그래밍 후 동적으로 바꿔서 브라우저로 보내는 것. 그리고 이를 사용해 Controller, View, Model에 적용한 패턴. 컨트롤러에서 뷰를 찾아서 템플릿 엔진을 통해 화면을 렌더링해 html 파일을 웹브라우저로 넘김
- MVC: Model, View, Controller. 과거에는 View와 Controller를 한번에 개발했음. 그러나 요즘에는 MVC 패턴으로 나눠서 작업함.
- View: 화면을 구성하는데 집중
- Controller: 비즈니스 로직과 관련되거나 내부적인 것을 처리하는 데 집중
- Model: 화면에서 필요한 것들을 담아서 넘겨줌
- @RequestParam: 외부에서 파라미터를 받을 때 사용
- localhost/hello-mvc?name=spring이라고 하면 @RequestParam으로 지정한 변수 name의 값에는 spring이 들어간다.
-
@GetMapping("hello-mvc") public String helloMVC(@RequestParam("name") String name, Model model) { model.addAttribute("name", name); return "hello-template"; }
- MVC: Model, View, Controller. 과거에는 View와 Controller를 한번에 개발했음. 그러나 요즘에는 MVC 패턴으로 나눠서 작업함.
- API: json 데이터 포맷으로 클라이언트한테 데이터를 전달하는 방식.
- 컨트롤러의 해당 메서드에 @ResponseBody 어노테이션을 지정한다
- @ResponseBody: http에서 헤더부, 바디부 중 바디부의 응답 데이터에 직접 해당 메서드의 리턴값을 넣겠다는 의미
- 이 경우 뷰가 없고 반환된 리턴값이 데이터값으로 전송됨
- 메서드의 자료형은 객체도 가능하다 해당 객체의 필드에 대해 setter메서드를 사용하여 매핑시킨 후 해당 url로 이동하면 아래 사진과 같이 출력됨을 알 수 있다. age 필드는 set하지 않았으므로 기본값인 0이 할당된다
- 위 모양은 JSON과 동일하다 즉, 객체를 리턴하면 해당 객체를 제이슨 형태로 데이터만 전송시킨다
- viewResolver 대신에 HttpMessageConverter가 동작하며 문자열을 입력받으면 StringHttpMessageConverter가, 객체를 입력받으면 JsonHttpMessageConverter가 데이터를 처리한다
섹션 3 회원 관리 예제 - 백엔드 개발
비즈니스 요구사항 정리
- 일반적인 웹 애플리케이션의 계층 구조
- 컨트롤러: 웹 MVC의 컨트롤러의 역할
- 서비스: 핵심 비즈니스 로직 구현
- 도메인: 회원, 주문, 쿠폰 등등 데이터베이스에 저장하고 관리되는 비즈니스 도메인 객체
- 리포지토리: 비즈니스 도메인 객체를 데이터베이스에 저장하고 관리하는 객체
- 클래스 의존관계
- 아직 데이터저장소가 선정되지 않아서, 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계
- 데이터 저장소는 RDB, NoSQL 등등 다양한 저장소를 고민중인 상황으로 가정
- 개발을 진행하기 위해서 초기 개발 단계에선느 구현체로 가벼운 메모리 기반의 데이터 저장소 사용
회원 도메인과 리포지토리 만들기
- Optional<E>: Optional<E> 타입의 메서드를 정의할 경우 해당 메서드가 null일 수 있는데 이를 처리할 때 Optional.ofNullable()메서드로 감싸서 처리함. 인수가 Null일 경우 Optional객체를 반환함
회원 리포지토리 테스트 케이스 작성
개발한 기능을 실행해서 테스트할 때 자바의 main 메서드를 통해서 실행하거나, 웹 애플리케이션의. 컨트롤러를 통해서 해당 기능을 실행한다. 이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다. 이런 경우를 위해 자바는 JUnit이라는 프레임워크로 테스트를 해서 해결한다
- start.spring.io를 통해 프로젝트를 만들면 자동으로 src/main/java 폴더와 src/test/java가 생성된다. 테스트를 하기 위해서 src/main/java에 작성한 패키지와 동일한 패키지를 src/test/java에 만들고 클래스 이름을 동일하게 가져온 뒤 제일 뒤에 Test를 붙인다 굳이 public으로 만들지 않아도 된다
- 클래스를 만든 뒤에 그냥 객체를 new로 바로 만들어 버리고 기존 클래스에 있던 메서드와 동일한 이름의 메서드를 void 타입으로 생성한 뒤 @Test 어노테이션을 붙인다
- 각 메서드를 비교하는데 이 경우 org.assertj.core.api.Assertions 클래스의 assertThat() 메서드를 이용한다
assertThat("비교할 객체/값1").isEqualTo("비교할객체/값2");을 하면 2와 1이 같으면(true) 테스트 성공, 다르면 테스트 실패라는 의미이다. - 테스트 클래스로 테스트를 진행하면 앞서 저장된 데이터(=테스트 케이스)가 여전히 남아 있어 후에 진행될 테스트에 방해가 될 수 이런 경우 테스트가 끝날 때마다 테스트 케이스를 지우는 메서드가 필요하다
- 해당 메서드는 @AfterEach 어노테이션을 지정하고 테스트 케이스를 clear하는 코드를 작성한다
- 테스트는 서로 의존 관계가 없도록 설계해야 한다. 이를 위해서 테스트 케이스를 먼저 설계한 뒤(틀을 먼저 만드는 설계) 구현 클래스를 생성할 수 있다. 이런 경우를 TDD(Test-Driven Development, 테스트 주도 개발)라고 한다
728x90
반응형
728x90
반응형
섹션1 프로젝트 환경설정
빌드하고 실행하기
- 터미널로 프로젝트 폴더로 이동해서 ./gradlew build 입력
./gradlew build
- 이후 build 폴더 안에 libs 폴더가 생성되고 안에 jar파일이 생성됨을 확인할 수 있다. 나의 경우 hello-spring-0.0.1-SNAPSHOT.jar 파일이다 이 파일을 java -jar hello-spring-0.0.1-SNAPSHOT.jar 명령어로 실행한다
java -jar hello-spring-0.0.1-SNAPSHOT.jar
- 서버에서 배포할 경우 위 jar파일만 export 시키고 해당 파일만 위 명령어로 사용하면 된다
섹션2 스프링 웹 개발 기초
정적 컨텐츠
- 정적 컨텐츠: 서버의 요구 없이 파일을 그대로 웹브라우저로 보내는 것
- 스프링 부트는 static 폴더에 제공된 파일을 찾아서 정적 컨텐츠 기능을 자동으로 제공함.
- localhost/hello-static.html로 이동하면 내장 톰캣 서버가 요청을 받고 스프링에 넘김. 스프링은 hello-static과 매핑된 컨트롤러가 있는지 찾아봄. 없으면 resources 폴더 내에서 해당 파일을 찾고 있으면 웹브라우저에 해당 페이지를 보여줌
MVC와 템플릿 엔진
- MVC와 템플릿 엔진: jsp, html 등의 템플릿 엔진을 서버에서 프로그래밍 후 동적으로 바꿔서 브라우저로 보내는 것. 그리고 이를 사용해 Controller, View, Model에 적용한 패턴. 컨트롤러에서 뷰를 찾아서 템플릿 엔진을 통해 화면을 렌더링해 html 파일을 웹브라우저로 넘김
- MVC: Model, View, Controller. 과거에는 View와 Controller를 한번에 개발했음. 그러나 요즘에는 MVC 패턴으로 나눠서 작업함.
- View: 화면을 구성하는데 집중
- Controller: 비즈니스 로직과 관련되거나 내부적인 것을 처리하는 데 집중
- Model: 화면에서 필요한 것들을 담아서 넘겨줌
- @RequestParam: 외부에서 파라미터를 받을 때 사용
- localhost/hello-mvc?name=spring이라고 하면 @RequestParam으로 지정한 변수 name의 값에는 spring이 들어간다.
-
@GetMapping("hello-mvc") public String helloMVC(@RequestParam("name") String name, Model model) { model.addAttribute("name", name); return "hello-template"; }
- MVC: Model, View, Controller. 과거에는 View와 Controller를 한번에 개발했음. 그러나 요즘에는 MVC 패턴으로 나눠서 작업함.
- API: json 데이터 포맷으로 클라이언트한테 데이터를 전달하는 방식.
- 컨트롤러의 해당 메서드에 @ResponseBody 어노테이션을 지정한다
- @ResponseBody: http에서 헤더부, 바디부 중 바디부의 응답 데이터에 직접 해당 메서드의 리턴값을 넣겠다는 의미
- 이 경우 뷰가 없고 반환된 리턴값이 데이터값으로 전송됨
- 메서드의 자료형은 객체도 가능하다 해당 객체의 필드에 대해 setter메서드를 사용하여 매핑시킨 후 해당 url로 이동하면 아래 사진과 같이 출력됨을 알 수 있다. age 필드는 set하지 않았으므로 기본값인 0이 할당된다
- 위 모양은 JSON과 동일하다 즉, 객체를 리턴하면 해당 객체를 제이슨 형태로 데이터만 전송시킨다
- viewResolver 대신에 HttpMessageConverter가 동작하며 문자열을 입력받으면 StringHttpMessageConverter가, 객체를 입력받으면 JsonHttpMessageConverter가 데이터를 처리한다
섹션 3 회원 관리 예제 - 백엔드 개발
비즈니스 요구사항 정리
- 일반적인 웹 애플리케이션의 계층 구조
- 컨트롤러: 웹 MVC의 컨트롤러의 역할
- 서비스: 핵심 비즈니스 로직 구현
- 도메인: 회원, 주문, 쿠폰 등등 데이터베이스에 저장하고 관리되는 비즈니스 도메인 객체
- 리포지토리: 비즈니스 도메인 객체를 데이터베이스에 저장하고 관리하는 객체
- 클래스 의존관계
- 아직 데이터저장소가 선정되지 않아서, 우선 인터페이스로 구현 클래스를 변경할 수 있도록 설계
- 데이터 저장소는 RDB, NoSQL 등등 다양한 저장소를 고민중인 상황으로 가정
- 개발을 진행하기 위해서 초기 개발 단계에선느 구현체로 가벼운 메모리 기반의 데이터 저장소 사용
회원 도메인과 리포지토리 만들기
- Optional<E>: Optional<E> 타입의 메서드를 정의할 경우 해당 메서드가 null일 수 있는데 이를 처리할 때 Optional.ofNullable()메서드로 감싸서 처리함. 인수가 Null일 경우 Optional객체를 반환함
회원 리포지토리 테스트 케이스 작성
개발한 기능을 실행해서 테스트할 때 자바의 main 메서드를 통해서 실행하거나, 웹 애플리케이션의. 컨트롤러를 통해서 해당 기능을 실행한다. 이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다. 이런 경우를 위해 자바는 JUnit이라는 프레임워크로 테스트를 해서 해결한다
- start.spring.io를 통해 프로젝트를 만들면 자동으로 src/main/java 폴더와 src/test/java가 생성된다. 테스트를 하기 위해서 src/main/java에 작성한 패키지와 동일한 패키지를 src/test/java에 만들고 클래스 이름을 동일하게 가져온 뒤 제일 뒤에 Test를 붙인다 굳이 public으로 만들지 않아도 된다
- 클래스를 만든 뒤에 그냥 객체를 new로 바로 만들어 버리고 기존 클래스에 있던 메서드와 동일한 이름의 메서드를 void 타입으로 생성한 뒤 @Test 어노테이션을 붙인다
- 각 메서드를 비교하는데 이 경우 org.assertj.core.api.Assertions 클래스의 assertThat() 메서드를 이용한다
assertThat("비교할 객체/값1").isEqualTo("비교할객체/값2");을 하면 2와 1이 같으면(true) 테스트 성공, 다르면 테스트 실패라는 의미이다. - 테스트 클래스로 테스트를 진행하면 앞서 저장된 데이터(=테스트 케이스)가 여전히 남아 있어 후에 진행될 테스트에 방해가 될 수 이런 경우 테스트가 끝날 때마다 테스트 케이스를 지우는 메서드가 필요하다
- 해당 메서드는 @AfterEach 어노테이션을 지정하고 테스트 케이스를 clear하는 코드를 작성한다
- 테스트는 서로 의존 관계가 없도록 설계해야 한다. 이를 위해서 테스트 케이스를 먼저 설계한 뒤(틀을 먼저 만드는 설계) 구현 클래스를 생성할 수 있다. 이런 경우를 TDD(Test-Driven Development, 테스트 주도 개발)라고 한다
728x90
반응형