[spring Boot]_8일차_boot 흐름 예제

youuu·2022년 10월 26일
0

SPRING

목록 보기
12/33

흐름 보기 위해서 간단하게 만들어보는 예제.
DB를 사용하지 않고 메모리에 담아 사용할때 쓰는 방법이다. (휘발성 메모리. -> 리부팅 하면 메모리 날라간다.)
-> Map 사용

⭐ 전통방식

프로젝트 시 이 방법은 사용하지 않는다.


1. 화면에서 이동가능한 링크 달기


📋 index.html

<!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>


2. Member1 객체 만들기


📋 Member1.java

  • id, name을 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;
	}

}


3. Repository 만들기


Repository
Entity에 의해 생성된 DB에 접근하는 메서드 들을 사용하기 위한 인터페이스.

📋 MemberRepository.java

Member1 DTO로 받아옴?

package com.oracle.oBootHello.repository;

import com.oracle.oBootHello.domain.Member1;

public interface MemberRepository {
	Member1 save(Member1 member1);	
}

📋 MemoryMemberRepository.java

  • 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;
	}
}

📋 MemberService.java

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();
	}
}

📋 MemberForm.html

  • /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>

📌📋 MemberController.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/를 넣으면 아래 화면 뜬다.





⭐ 바꾼방식



  1. MemberService에서 @Service 걸기(빈 등록)

📋 MemberService.java

@Service 걸기

@Service
public class MemberService {

@Service 하는 이유❓
@Autowired의 조건이 bean으로 등록 되어있는것만 가능하기 때문이다. 컴포넌트로 등록되어 있는것만 쓸수 있다..
(MemberService에서 @Service를 넣어 bean으로 등록)

Spring Bean 등록 방법 두가지

  1. 컴포넌트 스캔 원리
    @Controller @Service @Repository
  2. JAVA code로 직접 Spring Bean 등록
    @Configuration @Bean 을 쓴 후 JAVA code작성.

📌📋 MemberController.java

전통방식 -> 변경된 방식으로 수정.

  • 생성자 DI를 사용하였다.
    DI 사용이유❓
    전체적으로 변경하기 쉽다. 운용의 편리성 때문이다.
@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;
	}

📋 MemberService.java

전통방식 -> 바뀐 방식으로 수정

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();
	}
}

⭐ List 조회



  1. Controller에서 @GetMapping으로 memberList만들기

📌📋 MemberController.java

  • memberList 작성
    작성하면 allMembers에 밑줄 뜸. -> 클릭하여 생성
    😬오류 : 스펠링 오류.
    "/members/meberList")->memberList
    return "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";
	}


  1. Service에서 allMembers 만들기

📋 MemberService.java

  • MemberController에서 누르면 자동으로 틀이 생긴다.
  • 아래를 작성하면 findAll 에 밑줄뜸 -> 눌러서 생성
	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;
	}


  1. Repository에 List<Member1> findAll 만들기

📋 MemberRepository.java

  • 아래 추가 -> 자동으로 추가된다.
  • 저장하면 MemberService.java에 오류뜬다.
List<Member1> findAll();


  1. view에서 memberList 화면 만들기

📋 memberList.html

  • thymeleaf사용 <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>

💻 결과화면 :

회원가입회원목록 조회

profile
공부중인 주니어 개발자

0개의 댓글