스프링 공부 52

6-3. 스프링 통합 테스트

데이터베이스까지 포함된 테스트를 해보는 회차. 테스트를 돌리고 나면 그 테스트를 돌리기 이전으로 DB를 롤백해주는 @Transactional 이라는 어노테이션을 배운다. 지금까지 만들었던 테스트들은 스프링과 관련 없이 순수 자바 코드로만 만든 것이라고 한다. 테스트를 돌리면 모든 것이 JVM 내에서 이루어진다고 한다. 사실 스프링 초보인 나의 눈으로는 코드를 읽고 그런 사실을 알아채기 힘들다. 강사님이 그렇다고 하니 그렇구나 할 뿐이다. 추측을 해보자면, 이제서야 시스템 메모리가 아닌 제대로 된 DB를 사용하기 시작했고, 이 DB에 관한 정보는 내가 쓴 코드가 아니라 스프링이 들고 있다. 이것을 이제부터는 테스트에 반영할 것이라서 이런 말씀을 하셨나 보다. 그리고 '스프링 DB 접근 기술' 챕터의 나머지..

6-2. 순수 JDBC

지금은 여러 가지 편리한 기술들이 개발되어서, 실무에서 순수 JDBC로 개발하는 일은 거의 없다고 한다. 하지만 공부삼아 맛을 볼 기회를 주시겠다고 한다. 몇 십 년 전 고대의 선배님들과 십여 년 전의 강사님은 순수 JDBC로 개발을 했는데, 매우 괴로웠다고 한다... 환경설정 build.gradle로 들어가서 jdbc 및 h2와 관련된 라이브러리를 추가한다. 이렇게 붙여넣으면 된다. 붙여넣어야 하는 내용은 강의자료에 있다. 요 오른쪽 위의 코끼리 새로고침 버튼을 눌러주면 프로젝트에 적용이 된다. 그 다음에는 resources 안에 있는 application.properties로 들어간다. spring.datasource.url=에다가는 요놈을 복붙해준다. 그 밑에는 spring.datasource.dr..

6-1. H2 데이터베이스 설치

저번 시간에 회원 가입과 회원 조회 기능을 다 만들었고 테스트하는 과정에서 이렇게 세 명의 회원을 가입시켰다. 제대로 된 데이터베이스의 필요성 그런데! 우리가 지금 쓰고 있는 저장소가 어떻게 생겼는가? 이렇게 리포지토리 내부의 Map 객체에다가 저장하도록 되어있다. 그리고 리포지토리 객체는 프로그램을 새로 돌릴 때마다 매번 새로운 객체(bean)으로 만들어진다. 따라서, 서버를 껐다 켤 때마다 모든 데이터가 날아간다! 다시 돌려보면 진짜로 날아간다. 이제는 서버를 껐다 켜도 날아가지 않는 제대로 된 데이터베이스를 마련할 때가 되었다. H2 데이터베이스 설치 이번 시간에는 H2 데이터베이스를 설치한다. 되게 단순하고, 가볍고, 웹으로 콘솔을 제공하기 때문에 편하며, 교육용으로도 좋은 데이터베이스라고 한다...

5-3. 회원 웹 기능 - 조회

이번 회차에서는 오른쪽의 '회원 목록'을 눌러서 들어가는 /members 페이지를 만들 것이다. @GetMapping 메소드 만들기 list 라는 메소드를 만들고 @GetMapping("/members") 를 달아준다. 딱 보면 알 수 있듯이 여기 있는 전체 회원 조회 기능을 쓸 것이다. 이렇게 써주고 ctrl+alt+V 하면 짜잔 IntelliJ 최고 모델에다가 리스트를 통째로 담아준 뒤에 members/memberList.html 을 찾아들어가도록 리턴해준다. memberList.html 만들기 members 디렉토리 하위에 이렇게 새 html 을 만들고 내용을 복붙해준다. 이 부분의 내용을 살펴보자면, 마치 for문을 돌리듯이 아까 우리가 모델에 담아 전송해준 members라는 리스트의 모든 각각의..

5-2. 회원 웹 기능 - 등록

홈 화면에 하이퍼링크만 만들어놨던 이 '회원 가입', '회원 목록' 두 페이지 중에서 '회원 가입' 즉 /members/new 페이지를 만들어볼 것이다. 이 페이지는 회원 등록을 하는, 즉 사용자가 데이터를 서버에 제출하는 페이지이기 때문에 @GetMapping 만 쓰는 것이 아니라 @PostMapping도 써야 하고 form도 써야 한다. @GetMapping 메소드 만들기 MemberController를 열어서 다음과 같은 메소드를 추가한다. @GetMapping("/members/new") -> /members/new 의 경로로 GET 요청이 들어왔을 때 실행된다. return "members/createMemberForm"; -> templates 디렉토리 하위의 members 디렉토리 안에 있는..

5-1. 회원 웹 기능 - 홈 화면 추가

홈 화면을 추가할 것이다. 홈 화면용 컨트롤러 만들기 controller 패키지 안에 HomeController를 새로 만든다. 클래스 머리에 @Controller 어노테이션을 붙여주고 아래와 같이 간단한 메소드 하나를 만들어준다. @GetMapping()은 특정 URL 주소로 GET 요청이 들어왔을 때 이 메소드가 실행되도록 매핑해주는 역할을 한다. "/" 즉 웹 어플리케이션의 기본 URL과 home() 메소드가 연결되었다. 그러므로 이 코드는 홈 화면 주소를 치고 들어가면 "home.html"이라는 이름의 html 파일의 내용을 바탕으로 한 화면을 띄우라는 코드이다. home.html 만들기 이제 이 메소드에 의해 읽힐 html 파일을 만들어준다. html 작성은 프론트엔드의 몫이므로, 대충 강의자료..

화면 구성을 시작하기 전 중간점검

회원 관리 예제에서 지금까지 만든 부분을 살펴보자. 1. 도메인 도메인은 관리될 정보의 구조를 정의한다. 우리가 관리하는 정보는 회원 정보이다. 회원 정보에 무엇이 포함되는지(필드)와 그 정보를 넣고 빼는 데 필요한 메소드(getter와 setter)가 들어있는 도메인을 만들었다. 2. 리포지토리 리포지토리는 DB에 직접 접근하여, 도메인 객체를 저장하고 관리하는 역할을 한다. 내부 핵심 부품이라고 할 수 있다. 리포지토리는 인터페이스 하나, 구현체 하나를 만들었다. 구현체는 개발 과정에서 임시로 쓰기 위해 만든 것이고, 나중에 제대로 된 DB를 결정하면 인터페이스에 맞추어 새로운 구현체를 짠 뒤 갈아끼울 것이다. 3. 서비스 서비스는 리포지토리가 갖춘 기능을 활용하여 좀 더 사용자 친화적인 관점에서 웹..

4-2. 자바 코드로 직접 스프링 빈 등록하기

저번 시간에 어노테이션을 이용하여 콩 아주머니가 알아서 콩 설계도를 긁어모으도록 하는 법을 배웠다면, 이번엔 우리가 직접 콩 설계도 목록을 별도의 코드 파일로 마련하는 법을 배울 것이다. 그러므로 저번 시간에 넣어줬던 @Service, @Repository, @Autowired를 모두 지워준다. 단, 컨트롤러에 있는 어노테이션들은 지우지 말고 둬야 한다! 여기 있는 @Controller와 @Autowired는 가만히 둬야 한다! 어노테이션들을 싹 지우고 어플리케이션을 실행해보면 필요한 bean이 정의되어있지 않다는 메시지와 함께 빌드가 실패한다. 그럼 준비 끝이다. SpringConfig 파일 작성하기 여기다 SpringConfig라는 이름의 새 java class를 하나 만든다. 이 클래스에는 @Con..

4-1. 컴포넌트 스캔과 자동 의존관계 설정

이제 웹 브라우저에서 실제로 결과물이 보이도록 하는 과정을 시작해볼 것이다. MVC를 사용할 것이다. 그런데 본격적으로 시작하기 전에 해야 할 일이 있다. 콩 아주머니가 콩들을 콩 바구니에 담을 수 있게 해줘야 한다. 이걸 하는 방법에는 어노테이션을 활용한 컴포넌트 스캔과 자동 의존관계 설정 그리고 자바 코드로 직접 콩 설계도를 넘겨주는 방법 이렇게 두 가지가 있다. 이번 회차는 첫 번째 방법을 알아보는 회차이다. 컴포넌트 스캔이란? 스프링 앱을 실행시키는 순간, 스프링은 앱이 속한 패키지의 내용물들을 싹 훑는다. @Component를 찾는다. @Component가 붙은 클래스를 바탕으로 그 클래스의 객체를 하나씩 다 만들어서 스프링 컨테이너에 잘 담는다. 그리고 객체들을 알아서 관리해준다. 이렇게 스프..

3-5. 회원 서비스 테스트

저번 시간에 만든 서비스를 테스트해보는 회차이다. 테스트 코드의 틀을 짜주는 단축키 이번 회차에도 역시 IntelliJ의 편리한 기능이 하나 더 등장했다. 클래스의 구조 및 위치를 바탕으로, 이 클래스를 테스트하기 위한 테스트 코드의 기초적인 틀을 생성해주는 기능이다. 우리가 테스트할 MemberService 클래스에 이름에 커서를 위치시키고 단축키를 누른다. Windows 기준으로 ctrl+shift+T이다. 그럼 이런 것이 뜨는데, Create New Test를 선택한다. 그러면 새로 만들어질 테스트에 대한 설정 창이 뜬다. 이름은 기본적으로 테스트 대상 클래스의 이름 뒤에 Test를 붙인 것으로 생성되어있다. Testing library는 JUnit5로 해주고 클래스 내의 모든 메소드를 테스트할 것..