2 minute read

Main

controller

HelloController

GetMapping을 이용한 페이지 이동

  • http://localhost:8080/hello

RequsetParam 사용

  • http://localhost:8080/hello-mvc?name=sumi

return “hello-template”;

  • resources폴더의 hello-template.html파일을 읽어오게된다
@Controller
public class HelloController {
	@GetMapping("hello")
	pulic String hello(Model model) {
	model.addAttribute("data","hello");
	return "hello";
	}
	
	@GetMapping("hello-mvc") 
	public String helloMvc(@RequestParam(value="name",required = false) String name, Model model) {
		model.addAttribute("name",name);
		return "hello-template";
	}
	
	 @GetMapping("hello-api")
    @ResponseBody
    public Hello helloApi(@RequestParam("name") String name) {
        Hello hello = new Hello();
        hello.setName(name);
        return hello;
    }
    
    static class Hello {
        private String name;
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
    }
}

domain

Member

package hello.hellospring.domain;

public class Member {
    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

MemberRepository

interface 생성

package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.List;
import java.util.Optional;
public interface MemberRepository {
    Member save(Member member);
    Optional<Member> findById(Long id);
    Optional<Member> findByName(String name);
    List<Member> findAll();
}

MemoryMemberRepository

Optional 클래스

Optional<T>클래스는 ‘T’타입의 객체를 포장해주는 래퍼 클래스(Wrap class)이다.

따라서 Optional 인스턴스는 모든 타입의 참조변수를 저장할 수 있으며

Optional 객체를 사용해 예상치 못한 NullPointerException예외를 제공되는 메소드로 간단하게 회피할수 있다.

null값 으로 인해 발생하는 예외를 피하기 위해 사용

.get()을 이용해 Optional 객체에 저장된 값을 반환하여 사용

findAny()

findAny 는조건에 일치하는 요소 1개를 리턴합니다.

package hello.hellospring.repository;
import hello.hellospring.domain.Member;
import java.util.*;

public class MemoryMemberRepository implements MemberRepository {
    private static Map<Long, Member> store = new HashMap<>();
    private static long sequence = 0L;
    @Override
    public Member save(Member member) {
       member.setId(++sequence);
       store.put(member.getId, member);
       return member;
    }
    @Override
    public Optional<Member> findById(Long id) {
      return Optional.ofNullable(store.get(id));
    }
    @Override
    public List<Member> findAll() {
        return new ArrayList<>(store.values());
    }
    @Override
    public Optional<Member> findByName(String name) {
       return store.values().stream()
       	.filter(member -> member.getName().equals(name))
       	.findAny()
    }
    public void clearStore() {
        store.clear();
    }
}

service

MemberService

회원 서비스가 메모리 회원 리포지토리를 직접 생하게 했던것을

-> DI가 가능하게 변경

private final MemberRepository memberRepository = new MemoryMemberRepository()

->

 private final MemberRepository memberRepository;
 public MemberService(MemberRepository memberRepository) {
 this.memberRepository = memberRepository;
 }

자바 8에 추가된 Optional이 제공하는 ifPresent를 사용해서 null을 확인하는 if 문을 줄일 수 있다.

memberRepository.findByName(member.getName()) 값이 존재하는 경우에 그 안에 있는 내용을 실행하는 메소드

사용 예제

  memberRepository.findByName(member.getName())
     	.ifPresent(m -> {
     		throw new IlegalStateException("이미 존재하는 회원입니다. ");
     	})
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) {
     memberRepository.findByName(member.getName())
     	.ifPresent(m -> {
     		throw new IlegalStateException("이미 존재하는 회원입니다. ");
     	})
        }
    /**
     * 전체 회원 조회
     */
    public List<Member> findMembers() {
        return memberRepository.findAll();
    }
    public Optional<Member> findOne(Long memberId) {
        return memberRepository.findById(memberId);
    }
}