Skip to content

Jeongyeon #3

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 5 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from 4 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
13 changes: 13 additions & 0 deletions src/main/java/hello/hellospring/HelloSpringApplication.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package hello.hellospring;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class HelloSpringApplication {

public static void main(String[] args) {
SpringApplication.run(HelloSpringApplication.class, args);
}

}
57 changes: 57 additions & 0 deletions src/main/java/hello/hellospring/controller/HelloController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package hello.hellospring.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HelloController {
@GetMapping("hello")
public String hello(Model model) {
model.addAttribute("data", "hello!!");
return "hello";
}

@GetMapping("hello-mvc")
public String helloMcv(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}

@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}

@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
hello.setNum(100);
return hello;
}

static class Hello {
private String name;
private int num;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}

public void setNum(int num) {
this.num = num;
}

public int getNum() {
return num;
}
}

}
22 changes: 22 additions & 0 deletions src/main/java/hello/hellospring/domain/Member.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package hello.hellospring.domain;

public class Member {
private Long id; // 데이터를 구분하기 위해 시스템이 저장하는 id
private String name;

public Long getId() {
return id;
}

public String getName() {
return name;
}

public void setId(Long id) {
this.id = id;
}

public void setName(String name) {
this.name = name;
}
}
18 changes: 18 additions & 0 deletions src/main/java/hello/hellospring/repository/MemberRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package hello.hellospring.repository;

// 회원 객체를 저장하는 repository

import hello.hellospring.domain.Member;

import javax.swing.text.html.Option;
import java.util.List;
import java.util.Optional;

public interface MemberRepository {
Member save(Member member); // 회원 저장 -> 저장된 회원 반환
Optional<Member> findById(Long id); // ID로 member를 찾음
// Optional: 없으면 NULL인데, NULL을 반환할 때 Optional로 감싸서 반환
Optional<Member> findByName(String name); // name으로 menber를 찾음
List<Member> findAll(); // 전체 member 반환

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package hello.hellospring.repository;

import hello.hellospring.domain.Member;

import java.util.*;

public class MemoryMemberRepository implements MemberRepository {

// Map에 member save
private static Map<Long, Member> store = new HashMap<>();
private static long sequence = 0L; // key 값(id)을 생성
@Override
public Member save(Member member) {
member.setId((++sequence));
store.put(member.getId(), member); // store(member가 save되는 MAP)에 member 저장
return member;
}

@Override
public Optional<Member> findById(Long id) {
return Optional.ofNullable(store.get(id)); // NULL일 가능성이 있으면 Optional로 감싸서 반환
}

@Override
public Optional<Member> findByName(String name) {
return store.values().stream()
.filter(member -> member.getName().equals(name))
.findAny();
}

@Override
public List<Member> findAll() {
return new ArrayList<>(store.values());
}

public void clearStore(){
store.clear();
}
}
46 changes: 46 additions & 0 deletions src/main/java/hello/hellospring/service/MemberService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemberRepository;
import hello.hellospring.repository.MemoryMemberRepository;

import java.util.List;
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) {
// 같은 이름이 있는 중복 회원 X
memberRepository.findByName(member.getName()) // Optional member를 반환
.ifPresent(m -> { // ifPresent: 값이 있으면 수행
throw new IllegalStateException("이미 존재하는 회원입니다."); // 에러 발생
});
}

/**
* 전체 회원 조회
*/
public List<Member> findMembers(){
return memberRepository.findAll();
}

public Optional<Member> findOne(Long memberId){
return memberRepository.findById(memberId);

}
}
1 change: 1 addition & 0 deletions src/main/resources/application.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@

10 changes: 10 additions & 0 deletions src/main/resources/static/hello-static.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
12 changes: 12 additions & 0 deletions src/main/resources/static/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

<!DOCTYPE HTML>
<html>
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
Hello
<a href="/hello">hello</a>
</body>
</html>
5 changes: 5 additions & 0 deletions src/main/resources/templates/hello-template.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
<html xmlns:th="http://www.thymeleaf.org">
<body>
<p th:text="'hello ' + ${name}">hello! empty</p>
</body>
</html>
10 changes: 10 additions & 0 deletions src/main/resources/templates/hello.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>Hello</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<p th:text="'안녕하세요. ' + ${data}" >안녕하세요. 손님</p>
</body>
</html>
13 changes: 13 additions & 0 deletions src/test/java/hello/hellospring/HelloSpringApplicationTests.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package hello.hellospring;

import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
class HelloSpringApplicationTests {

@Test
void contextLoads() {
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package hello.hellospring.repository;

import hello.hellospring.domain.Member;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;

class MemoryMemberRepositoryTest { // 다른 데서 가져다 쓸 게 아니므로 public이 아니어도 됨
MemoryMemberRepository repository = new MemoryMemberRepository();

// test가 끝날 때마다 repository를 깔끔하게 지워주는 코드
@AfterEach // 동작이 끝날 때마다 수행한다는 의미
public void afterEach(){
repository.clearStore();
}

@Test // save() test
public void save() {
Member member = new Member();
member.setName("spring");

repository.save(member);

Member result = repository.findById(member.getId()).get(); // optional에서 값을 꺼낼 때 get 사용 가능
System.out.println("result = " + (result == member));
Assertions.assertEquals(result, member); // result와 member가 같은지 확인(1) (다르면 에러)
assertThat(member).isEqualTo(result);// result와 member가 같은지 확인(2) (다르면 에러)
}

@Test // findByName() test
public void findByName() {
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);

Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);

Member result = repository.findByName("spring1").get();
assertThat(result).isEqualTo(member1); // 다르면 에러
}

@Test // findAll() test
public void findAll(){
Member member1 = new Member();
member1.setName("spring1");
repository.save(member1);

Member member2 = new Member();
member2.setName("spring2");
repository.save(member2);

List<Member> result = repository.findAll();

assertThat(result.size()).isEqualTo(2); // member 수와 일치하지 않으면 에러
}
}
68 changes: 68 additions & 0 deletions src/test/java/hello/hellospring/service/MemberServiceTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
package hello.hellospring.service;

import hello.hellospring.domain.Member;
import hello.hellospring.repository.MemoryMemberRepository;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import static org.assertj.core.api.AssertionsForClassTypes.assertThat;
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 회원가입() { // test code는 한글로 적어도 됨
// given
Member member = new Member();
member.setName(("hello"));

// when
Long saveId = memberService.join(member);


// then
Member findMember = memberService.findOne(saveId).get();
Assertions.assertThat(member.getName()).isEqualTo(findMember.getName());
}

@Test
public void 중복_회원_예외(){ // 이름이 중복되는 회원이 가입하려고 할 때 예외 처리가 정상적으로 수행되는지 확인
// given
Member member1 = new Member();
member1.setName("spring");

Member member2 = new Member();
member2.setName("spring"); // member 이름이 중복됨

// when
memberService.join(member1);
IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));// A -> B: B가 실행되면 A가 터져야 함

assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다."); // 중복 회원이 발생했을 때 이 메시지가 정상적으로 발생하는지 확인


// then
}
@Test
void findMembers() {
}

@Test
void findOne() {
}
}
Loading