diff --git "a/resources/\354\273\250\355\212\270\353\241\244\353\237\254-\354\212\244\355\203\234\355\213\261 \354\232\260\354\204\240\354\210\234\354\234\204.png" "b/resources/\354\273\250\355\212\270\353\241\244\353\237\254-\354\212\244\355\203\234\355\213\261 \354\232\260\354\204\240\354\210\234\354\234\204.png" new file mode 100644 index 0000000..bb6d556 Binary files /dev/null and "b/resources/\354\273\250\355\212\270\353\241\244\353\237\254-\354\212\244\355\203\234\355\213\261 \354\232\260\354\204\240\354\210\234\354\234\204.png" differ diff --git "a/\354\204\271\354\205\2305 \355\232\214\354\233\220 \352\264\200\353\246\254 \354\230\210\354\240\234 - \354\233\271 MVC \352\260\234\353\260\234.md" "b/\354\204\271\354\205\2305 \355\232\214\354\233\220 \352\264\200\353\246\254 \354\230\210\354\240\234 - \354\233\271 MVC \352\260\234\353\260\234.md" new file mode 100644 index 0000000..103df62 --- /dev/null +++ "b/\354\204\271\354\205\2305 \355\232\214\354\233\220 \352\264\200\353\246\254 \354\230\210\354\240\234 - \354\233\271 MVC \352\260\234\353\260\234.md" @@ -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 + + + +
+
+

Hello Spring

+

회원 기능

+

+ 회원 가입 + 회원 목록 +

+
+
+ + +``` + +이제부터 `/`로 오는 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 + + + +
+
+
+ + + +
+ +
+
+ + +``` + +```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 members = memberService.findMembers(); + + model.addAttribute("members", members); + return "members/memberList"; + } + ... +} +``` + +```html + + + +
+
+ + + + + + + + + + + + + +
#이름
+
+
+ + +``` + +자바의 for-each 문법과 닮은 문법이 Thymeleaf에 있다. member.id는 member 객체의 getId 메소드를 호출해 값을 알아내는 방식으로 작동한다. + +이는 장고 템플릿 언어의 `{% for member in members %} {{ member.id }}`와 매우 유사하다. \ No newline at end of file diff --git "a/\354\204\271\354\205\2306 \354\212\244\355\224\204\353\247\201 DB \354\240\221\352\267\274 \352\270\260\354\210\240.md" "b/\354\204\271\354\205\2306 \354\212\244\355\224\204\353\247\201 DB \354\240\221\352\267\274 \352\270\260\354\210\240.md" new file mode 100644 index 0000000..27837be --- /dev/null +++ "b/\354\204\271\354\205\2306 \354\212\244\355\224\204\353\247\201 DB \354\240\221\352\267\274 \352\270\260\354\210\240.md" @@ -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을 작성한다. +