ctrl + n
=> getter setter 쉽게 만들기
alt + enter
=> implements 상황에서 즉시 method 구현하기
ctrl
+ → => 단어단위 이동
ctrl + del
=> 단어단위 삭제
ctrl + i
=> implement 가능한 메서드 확인 (opt + enter
)
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 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());
}
예전엔 if문을 써서 null 객체를 생성하였지만 요즘엔 null이 반환될 가능성이 있다면 이렇게 optional
키워드로 예외처리를 할 수 있다. 그래서 null일때도 감싸서 보낼 수 있다. 이렇게 하면 client에서도 뭘 할수가 있다.
stream : 이건 data와 POJO의 data관을 만들어준다고 생각하면 된다. 또한 stream()
은 마치 반복문처럼 data 하나하나를 돌며 어떠한 로직을 실행한다.
findAny()
: 얘는 찾다가 찾아지면 그냥 바로 반환한다.
그럼 findany vs findfist 는 무슨 차이냐? 라고 할 수 있는데
stream의 순서를 고려하냐 안 하냐의 차이이다. 즉, findAny()
는 조건에 부합하는 결과값이 여러개라면 결과값이 실행할 때마다 달라질 수 있다.
Test
를 붙여준다.@Test
annotation만 작성해주면 된다.ctrl + alt + V
(mac cmd+opt+v
) : 값 refactoringctrl + p
: 메서드 상세정보@Test
public void save(){
Member member = new Member();
member.setName("Spring");
repository.save(member);
Member result = repository.findById(member.getId()).get();// refactoring가능 ctrl + alt + V
// 결과값 code
}
alt + enter
: static import가 뜬다. 이걸 이렇게 쓴다면 앞의 Assertions 객체가 static memory에 올라가 객체를 쓰지 않고도 method를 바로 쓸 수 있다는 편리한 점이 있따. ctrl + d
: 복사 붙여넣기 즉시 실행shift + F6
: 해당 class내의 변수 이름 동시 변경final
처럼 어떠한 함수가 돌더라도 항상 실행되는 @AfterEach
문으로 비워주면 된다.tdd
(test 주도 개발)이라 한다.ifPresent
라는 메서드를 작성하여 stream 형태로 처리하고 또 이를 하나의 메서드로 묶어서 사용할 수도 있다.
ctrl + alt + shift + T
: Refactoring
(메서드에 커서 올려놓고) ctrl + B
: 해당 매서드가 사용되는 곳 보기
ctrl + shift + m
: method로 Refactoring
public class MemberService {
private final MemberRepository memberRepository = new MemoryMemberRepository();
// 회원가입
public Long join(Member member){
// 같은 이름이 있는 중복 회원 X
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);
}
}
ctrl + shift + T
: test를 위한 package와 code를 알아서 만들어준다.사실 영어를 조금만 할 줄 아면 무슨 뜻인지 금방 느낄 것이다.
given : 검증할 데이터가 들어감
when : 실제 검증할 코드
then : 검증부가 들어갈 부분
으로 나누어 잡고 테스트 케이스를 작성하면 매우 긴 테스트 케이스도 조금 수월하게 작성할 수 있다.
초급 개발자는 이런식으로 깔아놓고 하면 굉장히 도움이 된다.
memberService.join(member1);
try {
memberService.join(member2);
fail();
} catch (IllegalStateException e) {
assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
}
memberService.join(member1);
assertThrows(IllegalStateException.class,()-> memberService.join(member2));
assertThrow
를 이용한다.shift + F10
: 이전에 실행했던 것 그대로 다시 실행 (mac opt + r
)