일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- rails
- ruby
- 건담
- 일본어
- 디지몬
- 비즈니스일본어
- nico
- Spring
- DART
- jsp
- html
- 연습문제
- 자바
- C로 시작하는 컴퓨터 프로그래밍4판
- 반다이몰
- 건담베이스
- springboot
- 単語
- 一日一つメソッド
- メソッド
- 인프런
- Python
- rails7
- Web
- java
- 日本語
- javascript
- CSS
- Flutter
- vscode
Archives
- Today
- Total
AR삽질러
SpringBoot - 회원관리기초(2) 본문
728x90
https://arang95.tistory.com/80
회원서비스
import java.util.Optional;
public class MemberService {
private final MemberRepository memberRepository;
public MemberService(MemberRepository memberRepository){
this.memberRepository = memberRepository;
}
// 회원가입
public Long join(Member member) {
// 같은 이름이 있는 중복회원은 존재할 수 없다.
validateDuplicateMember(member); // 중복회원 검증
memberRepository.save(member);
return member.getId();
}
private void validateDuplicateMember(Member member) {
memberRepository.findByName(member.getName())
.ifPresent(m -> {
throw new IllegalStateException("존재하는 회원이름입니다.");
});
}
// 전체회원조회
public List<Member> findMembers() {
return memberRepository.findAll();
}
public Optional<Member> findOne(Long memberId){
return memberRepository.findById(memberId);
}
}
회원서비스 테스트
package hello.hellospring.service;
import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;
import hello.hellospring.repository.MemoryMemberRepositoryTest;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*;
class MemberServiceTest {
MemberService memberService;
MemoryMemberRepository memberRepository;
@BeforeEach
public void beforeEach(){
memberRepository = new MemoryMemberRepository();
memberService = new MemberService(memberRepository);
}
@AfterEach
public void afterEach(){
memberRepository.clearStore();
}
// 회원가입 테스트
@Test
void join() {
// 문법 given, when, then
// given : Member 객체를 생성하고 이름을 "hello"로 정의한다.
Member member = new Member();
member.setName("hello");
//when
// MemberService클래스의 join메서드를 호출하고 반환된 값을 savaId 변수에 저장한다.
Long savaId = memberService.join(member);
//then
// 저장된 ID값을 사용하여 memberService의 findOne메서드를 호출하여 Member객체를 검색하고
// 검색된 Member객체의 이름과 기존 Member객체의 이름이 같은지를 비교한다.
Member findMember = memberService.findOne(savaId).get();
Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
}
@Test
public void duplicatedException() throws Exception {
//Given
Member member1 = new Member();
member1.setName("spring");
Member member2 = new Member();
member2.setName("spring");
//When
memberService.join(member1);
IllegalStateException e = assertThrows(IllegalStateException.class,
() -> memberService.join(member2));//예외가 발생해야 한다.
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
@Test
void findMembers() {
}
@Test
void findOne() {
}
}
Given-When-Then패턴
- 테스트 케이스를 작성하는 방법중 하나로, 테스트케이스를 쉽게 이해하고 작성할 수 있도록 3단계로 나누어 작성한다.
Given : 테스트를 수행하기 위해 필요한 조건을 설정한다.
When : 실제로 테스트할 작업을 수행한다.
Then : 테스트 결과를 수행한다.
스프링빈과 의존관계
1. 컴포넌트 스캔
- 스프링빈에서 빈을 자동으로 등록하는 방법으로 컴포넌트스캔을 사용하면 자동으로 @Component 어노테이션이 붙은 클래스를 스캔하여 빈으로 등록된다.
2. 자바 코드로 직접 스프링 빈등록
- 빈을 등록하는 코드를 직접 작성하는 방법으로 장점은 빈을 등록하는 방법을 명확하게 할 수 있고 개발자가 직접 빈을 생성하여 관리할 수 있다. 단점으로는 빈을 등록하는 코드를 직접 작성해야하기 때문에 번거롭고 빈을 생성 및 관리를 스프링이 해줄 수 없기 때문에 개발자가 직접 빈의 생성주기 및 관리를 해야한다.
회원관리 - MVC
1) 메인화면
Controller
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";
}
}
package hello.hellospring.controller;
import hello.hellospring.domain.Member;
import hello.hellospring.service.MemberService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import java.util.List;
@Controller
public class MemberController {
private final MemberService memberService;
@Autowired
public MemberController(MemberService memberService) {
this.memberService = memberService;
}
@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());
System.out.println("memberName = " + member.getName());
memberService.join(member);
return "redirect:/";
}
// 회원조회
@GetMapping("/members")
public String list(Model model){
List<Member> members = memberService.findMembers();
model.addAttribute("members", members);
return "members/memberList";
}
}
view
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>indexPage</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<header>
<h1>Hello Spring IndexPage</h1>
</header>
<hr>
<nav>
<ol>
<h3>회원기능</h3>
<li><a href="/members/new">회원가입</a></li>
<li><a href="/members">회원목록</a></li>
</ol>
</nav>
<article>
<br><br><h3>회원관리기초</h3>
<p>- MVC를 이용한 예제</p>
<hr>
</article>
</body>
</html>
2) 회원등록
package hello.hellospring.controller;
public class MemberForm {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>memberInsertPage</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<header>
<h1>Hello Spring IndexPage</h1>
</header>
<hr>
<nav>
<ol>
<h3>회원기능</h3>
<li><a href="/members/new">회원가입</a></li>
<li><a href="/members">회원목록</a></li>
</ol>
</nav>
<div class="container">
<form action="/members/new" method="post">
<div class="form-group">
<br><br><h3>회원가입</h3>
<p>회원가입 정보입력란</p>
<hr>
<label for="name">이름</label>
<input type="text" id="name" name="name" placeholder="이름을 입력하세요!">
</div><br><br>
<button type="submit">등록</button>
<button type="reset">취소</button>
</form>
</div>
</body>
</html>
3) 회원조회
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>memberInsertPage</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<header>
<h1>Hello Spring IndexPage</h1>
</header>
<hr>
<nav>
<ol>
<h3>회원기능</h3>
<li><a href="/members/new">회원가입</a></li>
<li><a href="/members">회원목록</a></li>
</ol>
</nav>
<div class="container">
<div class="container">
<br><br><h3>회원 목록</h3>
<p>회원목록정보</p>
<hr>
<table>
<thead>
<tr>
<th>------ 등록된 회원 -------</th>
</tr>
</thead>
<tbody><!--model안의 값을 루프를 돌면서 꺼내어 보여준다. -->
<tr th:each="member : ${members}">
<td th:text="${member.id}"></td>
<td th:text="${member.name}"></td>
</tr>
</tbody>
</table>
</div><br><br>
</div>
</body>
</html>
--------------------------------------------------------------------------------------------
https://github.com/designAR/SpringBoot-base
728x90
반응형
LIST
'JAVA > SpringBoot' 카테고리의 다른 글
SpringBoot_Gradle_Mysql_JPA_API테스트_postman과JUnit5차이(2) (0) | 2023.05.22 |
---|---|
SpringBoot_Gradle_Mysql_JPA - listAPI만들기(1) (2) | 2023.05.21 |
SpringBoot-회원관리기초(1) (0) | 2023.03.20 |