Skip to content

섹션5 회원 관리 예제, 섹션6 스프링 DB 접근 기술 중 ~H2 데이터베이스 설치 노트 #4

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
155 changes: 155 additions & 0 deletions 섹션5 회원 관리 예제 - 웹 MVC 개발.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,155 @@
# 섹션5. 회원 관리 예제 - 웹 MVC 개발

회원 웹 기능으로 홈화면을 추가하고 회원 등록, 회원 목록 조회 컨트롤을 만들어본다.

# 홈 화면 추가

`/`로 오는 GET 요청에 응답하기 위해 HomeController와 처리 메소드, `home.html`을 만든다.

```java
package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HomeController {
@GetMapping("/")
public String home() {
return "home";
}
}
```

```html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
<div>
<h1>Hello Spring</h1>
<p>회원 기능</p>
<p>
<a href="/members/new">회원 가입</a>
<a href="/members">회원 목록</a>
</p>
</div>
</div> <!-- /container -->
</body>
</html>
```

이제부터 `/`로 오는 GET 요청은 기존의 `resources/static/index.html`이 아닌 `home.html`이 반환되기 시작한다. 그 이유는 스프링이 먼저 스프링 컨테이너에서 관련된 컨트롤러를 찾고, 없으면 static 파일을 찾기 때문이다.

![컨트롤러-스태틱 우선순위](resources/컨트롤러-스태틱%20우선순위.png)

# 회원 등록

MemberController에 `/members/new` GET, POST 요청에 응답하는 메소드와 html 파일을 만든다. HTML 파일의 form 태그 내부 input 태그의 name property가 핵심이다. name property의 값과 폼으로 쓰는 자바 클래스의 멤버 변수와 이름이 일치해야 한다.

```java
@Controller
public class MemberController {
...
@GetMapping("/members/new")
public String createForm() {
return "members/createMemberForm";
}

@PostMapping("/members/new")
public String create(MemberForm form) {
Member member = new Member();
member.setName(form.getName());

memberService.join(member);

return "redirect:/";
}
```

```html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
<form action="/members/new" method="post">
<div class="form-group">
<label for="name">이름</label>
<input type="text" id="name" name="name" placeholder="이름을 입력하세요">
<!-- ^ ^ 서버에서 key로 쓰는 값 -->
</div>
<button type="submit">등록</button>
</form>
</div> <!-- /container -->
</body>
</html>
```

```java
package hello.hellospring.controller;

public class MemberForm {
// 단순 자바 클래스로 HTML 폼 내용을 자바로 받기 위함
private String name;

public String getName() {
// ^ 존재해야 함
return name;
}

public void setName(String name) {
this.name = name;
}
}
```

스프링은 HTML form input 태그의 `name="variable"`을 보고 폼 객체의 setter인 `setVariable()`을 찾아 호출하여 PostMapping된 메소드의 argument로 넘겨준다. Setter가 반드시 있어야 한다.

# 회원 리스트 조회

회원 컨트롤러에 `/members` GET 요청을 처리하는 메소드를 정의한다.

```java
@Controller
public class MemberController {
...
@GetMapping("/members")
public String list(Model model) {
List<Member> members = memberService.findMembers();

model.addAttribute("members", members);
return "members/memberList";
}
...
}
```

```html
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<body>
<div class="container">
<div>
<table>
<thead>
<tr>
<th>#</th>
<th>이름</th>
</tr>
</thead>
<tbody>
<tr th:each="member : ${members}">
<td th:text="${member.id}"></td>
<td th:text="${member.name}"></td>
</tr>
</tbody>
</table>
</div>
</div> <!-- /container -->
</body>
</html>
```

자바의 for-each 문법과 닮은 문법이 Thymeleaf에 있다. member.id는 member 객체의 getId 메소드를 호출해 값을 알아내는 방식으로 작동한다.

이는 장고 템플릿 언어의 `{% for member in members %} {{ member.id }}`와 매우 유사하다.
47 changes: 47 additions & 0 deletions 섹션6 스프링 DB 접근 기술.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
# 섹션6. 스프링 DB 접근 기술

# 소개

- 순수 JDBC로 개발 체험
- JDBC: 애플리케이션 서버와 DB를 SQL로 연결하는 기술

- 스프링 제공 JdbcTemplate으로 편한 JDBC 개발 체험

- JPA 체험: SQL을 생성해주는 기술

- 스프링 데이터 JPA 체험: JPA를 편하게 쓸 수 있게 감싼 기술

# H2 데이터베이스 설치

교육용으로 좋은 가볍고, 어드민 제공하는 데이터베이스

1. H2 설치
2. H2 콘솔 - 연결 클릭

데이터베이스 파일 있는지 확인

`~/test.mv.db`

3. 파일을 직접 접근 시 동시접근 안되는 문제 있으므로 동시접근 위해 소켓 통해 접근

`JDBC URL`: `jdbc:h2:tcp://localhost/~/test`


## 테이블 생성

```sql
drop table if exists member CASCADE;
create table member
(
id bigint generated by default as identity,
name varchar(255),
primary key (id)
);
```

`generated by default as identity` : 값 없이 추가하면 DB가 자동으로 채운다

## SQL 관리

버전 컨트롤에 반영되도록 `프로젝트 폴더/sql/ddl.sql`에 테이블 생성 SQL을 작성한다.