✔ 흐름 보기 위해서 간단하게 만들어보는 예제.
✔ DB를 사용하지 않고 메모리에 담아 사용할때 쓰는 방법이다. (휘발성 메모리. -> 리부팅 하면 메모리 날라간다.)
-> Map 사용
프로젝트 시 이 방법은 사용하지 않는다.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>나 Index야</h1>
<a href="/hello">Hello</a>
<a href="/members/memberForm">회원가입</a><p>
<a href="/members/memberList">회원목록</a><p>
</body>
</html>
getter
, setter
package com.oracle.oBootHello.domain;
public class Member1 {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Repository ❓
Entity에 의해 생성된 DB에 접근하는 메서드 들을 사용하기 위한 인터페이스.
Member1 DTO로 받아옴?
package com.oracle.oBootHello.repository;
import com.oracle.oBootHello.domain.Member1;
public interface MemberRepository {
Member1 save(Member1 member1);
}
MemberRepository
인터페이스를 넣어서 만든 클래스.
공용으로 쓰기 위해 sequence를 사용하였다.
private static Long sequence = 0L;
Map(key, value)을사용하는데 (member1.getId(), member1)
로 넣었다.
🔺 이때 (id, name)이 아니라 member1로 넣은 이유❓
확장성을 고려하여 name이 아닌 member1로 넣었다.
member1.setId(++sequence);
는 DB로 치면 sequence와 동일.
@Repository
넣기
package com.oracle.oBootHello.repository;
import java.util.HashMap;
import java.util.Map;
import com.oracle.oBootHello.domain.Member1;
public class MemoryMemberRepository implements MemberRepository {
private static Map<Long, Member1> store = new HashMap<Long, Member1>();
private static Long sequence = 0L; //Long 형으로 캐스팅 해서 저장.
@Override
public Member1 save(Member1 member1) {
member1.setId(++sequence); // -> DB로 치면 sequence와 동일.
store.put(member1.getId(), member1); // 확장성을 고려하여 name이 아닌 member1로 넣음
System.out.println("MemoryMemberRepository + member1.getName() --->" + member1.getName());
return member1;
}
}
MemoryMemberRepository
연결
package com.oracle.oBootHello.service;
import com.oracle.oBootHello.domain.Member1;
import com.oracle.oBootHello.repository.MemoryMemberRepository;
public class MemberService {
MemoryMemberRepository memberRepository = new MemoryMemberRepository();
//회원가입
public Long memberSave(Member1 member1) {
System.out.println("MemberService memberSave Start...");
memberRepository.save(member1);
return member1.getId();
}
}
/members/save
<!DOCTYPE html>
<html xml:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<form action="/members/save" method="post">
<label for="name">이름</label>
<input type="text" id="name" name="name" placeholder="이름을 입력하세요">
<button type="submit">등록</button>
</form>
</body>
</html>
post로 보낸것은 post로
@PostMapping(value = "/members/save")
package com.oracle.oBootHello.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import com.oracle.oBootHello.domain.Member1;
import com.oracle.oBootHello.service.MemberService;
@Controller
public class MemberController {
MemberService memberService = new MemberService();
@GetMapping(value = "/members/memberForm")
public String memberForm() {
System.out.println("MemberController /members/memberForm Start...");
return "members/memberForm";
}
@PostMapping(value = "/members/save")
public String save(Member1 member1) {
System.out.println("MemberController /members/save Start...");
Long id = memberService.memberSave(member1);
System.out.println("MemberController /members/save id ---->" + id);
return "redirect:/";
}
}
주소창에 http://localhost:8381/
를 넣으면 아래 화면 뜬다.
@Service
걸기(빈 등록)
@Service
걸기
@Service
public class MemberService {
@Service
하는 이유❓
@Autowired
의 조건이 bean으로 등록 되어있는것만 가능하기 때문이다. 컴포넌트로 등록되어 있는것만 쓸수 있다..
(MemberService
에서 @Service
를 넣어 bean으로 등록)
@Controller
@Service
@Repository
@Configuration @Bean
을 쓴 후 JAVA code작성.전통방식 -> 변경된 방식으로 수정.
@Controller
public class MemberController {
//전통적
// MemberService memberService = new MemberService();
/* 수정된 방식 */
// 필드 DI
// @Autowired
// private MemberService memberService;
// 생성자 DI
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
전통방식 -> 바뀐 방식으로 수정
package com.oracle.oBootHello.service;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.oracle.oBootHello.domain.Member1;
import com.oracle.oBootHello.repository.MemberRepository;
import com.oracle.oBootHello.repository.MemoryMemberRepository;
@Service
public class MemberService {
// 전통적
// MemoryMemberRepository memberRepository = new MemoryMemberRepository();
private final MemberRepository memberRepository;
@Autowired
public MemberService(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
//회원가입
public Long memberSave(Member1 member1) {
System.out.println("MemberService memberSave Start...");
memberRepository.save(member1);
return member1.getId();
}
}
"/members/meberList")
->memberListreturn "member/memberList";
-> members@GetMapping(value = "/members/memberList")
public String memberList(Model model) {
logger.info("memberList Start...");
List<Member1> memberLists = memberService.allMembers();
model.addAttribute("memberLists", memberLists);
logger.info("memberLists.size() ---> {}", memberLists.size());
return "members/memberList";
}
MemberController
에서 누르면 자동으로 틀이 생긴다. public List<Member1> allMembers() {
System.out.println("MemberService allMembers Start...");
List<Member1> memList = null;
memList = memberRepository.findAll();
System.out.println("memList.size() -->" + memList.size());
return memList;
}
List<Member1> findAll
만들기MemberService.java
에 오류뜬다.List<Member1> findAll();
<html xml:th="http://www.thymeleaf.org">
<!DOCTYPE html>
<html xml:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
<table border="1">
<thead>
<tr>
<th>No</th>
<th>이름</th>
</tr>
</thead>
<tbody>
<tr th:each="member : ${memberLists}">
<td th:text="${member.id}"></td>
<td th:text="${member.name}"></td>
</tr>
</tbody>
</table>
</body>
</html>
회원가입 후 회원목록 조회