ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • TIL 19일차(2021.11.09), 단축키 TIP 모음, intellij create git
    TIL(Today I Learned) 2021. 11. 9. 11:41

    TestCase 작성

    웹 애플리케이션을 통한 테스트는 시간이 많이 소요되고, 반복 실행이 어렵다, 여러테스트를 한번에 실행하기 어렵다는 단점이 있다.
    그래서 Junit이라는 프레임워크로 테스트를 실행하여 이러한 문제점을 해결한다.

    예시)

    //    Junit Test
        @Test
        public void save(){
            Member member = new Member();
            member.setName("spring");
    
            repository.save(member);
    
            Member result = repository.findById(member.getId()).get();
    //        System.out.println("result = " + (result == member);
    //          junit Assertions
    //        Assertions.assertEquals(member, result);
    //        org.assertj
            assertThat(member).isEqualTo(result);
        }

    -> 여러가지 방식으로 member Id를 호출하는 코드(주석처리함.)
    -> 이외에 callback function method를 작성해서 오류를 방지.
    -> 구현 클래스를 먼저 만들고 테스트케이스를 만드는 방식.

    Tip

    어느 위치에서든 한줄 내려가기 : ctrl + shift + enter

    변수 출력하기 : ctrl + alt + v

    System.out.println 자동 생성 :'sout' + tap
    변수를 출력하는 syso 자동 생성 : 'soutv' + tap

    assertions import static 키 : alt + anter

    같은 변수 한번에 수정 : shift + f6

    refacotr(extract method .. etc) : ctrl + alt + shift + t

    해당 라인 줄 삭제 : ctrl + x

    범위 주석 : ctrl + shift + /

    전에 실행했던걸 다시 실행 : shift + f10

    Test file 빠르게 만들기 : ctrl + shift + T

    전체 라인 선택 : ctrl + c

    constructor 생성 : fn + alt + insert

    최근 본 목록 : ctrl + E

    inline values : ctrl + alt + n

    세미콜론까지 자동 생성되는 단축키 : ctrl + shitf + enter

    create git : ctrl + shift + a -> share project on git

    ctrl + E : 이전에 작업했던 파일들 목록보여줌,
    ctrl + E + enter : 이전에 작업했던 파일로 돌아감

    ctrl + alt + b : 해당하는 변수나 클래스의 파일 위치로감

    ctrl + alt + m : 해당하는 클래스 이름 리팩토링(중복된 것들도 함께 바꿔줌)

    iter + enter : for Each문 자동 생성

    ctrl + D : 자동 복사 + 붙여넣기

    shift + shift : class 검색

    ctrl + r : 단어를 간편하게 replace할 수 있게 도와주는 기능(클래스에도 적용가능)

    Optional 과 lambda

       /**
         * 회원가입
         */
        public Long join(Member member){
            validateDuplicateMember(member); // 중복회원 검증
            memberRepository.save(member);
            return member.getId();
        }
    
        private void validateDuplicateMember(Member member) {
            //Optional lambda 처리
            memberRepository.findByName(member.getName())
            .ifPresent(m -> {
                throw new IllegalStateException("이미 존재하는 회원입니다.");
            });
        }
    • Optional 기능을 통해 if문 남발 방지
    • lambda로 코드 가독성 증가
    • extract method로 가독성 증가
    • IllegalStateException(String s) 사용으로 예외처리 메시지 던짐.

    DI(Dependency Injection)

    Dependendy : 종속성 Injection : 주입

    자바에서 객체를 부품이라고 했을 때, 하나의 부품을 다른 부품에 주입하는것을
    DI라고 한다. 즉, 부품을 조립해준다!

    -> DI는 느슨하게 객체를 서로 결합하면서 의존성은 낮춰준다
    -> 재사용성이 좋아진다!
    -> 테스트하기 좋은 코드가 된다!
    -> 가독성이 좋아진다!

    DI를 적용하지 않은 예)

    B b = new B();
    A a = new A();
    a.setB(b); //a라는 부품에 b를 주입시킬때 'setter injection'을 사용했다. 

    DI를 적용한 예)

    B b = new B(); 
    A a = new A(b); //Construction Injection 사용

    아래 코드는 테스트코드

    class MemberServiceTest {
    
        MemberService memberService = new MemberService();
        MemoryMemberRepository memberRepository = new MemoryMemberRepository();
    
        @AfterEach
        public void afterEach(){
            memberRepository.clearStore();
        }    

    아래 코드는 서비스 로직 코드

    public class MemberService {
    
        private final MemberRepository memberRepository = new MemoryMemberRepository();

    두 코드는 똑같이 MemberRepository가 존재하지만 사실상 서로 다른 객체이다. 때문에 에러가 발생할 수 있다. 이때 DI를 사용해서 서로 같은 객체가 되도록 설정해준다.()

    아래는 멤버 리포지토리 구현 코드이다

    public class MemoryMemberRepository  implements MemberRepository{
    
        //연습이기 때문에 동시성 문제 발생할 수 있음(해결방법 : Concurrent)
        private static Map<Long, Member> store = new HashMap<>();
        private static long sequence = 0L;

    -> static으로 설정되어서 이 클래스에서만 적용되는것이라 이 때는 문제가 없을 수 있지만, static으로 선언되지 않으면 문제가 발생할 수 있기때문에 DI를 사용하는것이 좋다

    서비스 구현 코드에서

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

    -> 외부에서 memberRepository를 입력하게 구현해주고

    class MemberServiceTest {
    
        MemberService memberService;
        MemoryMemberRepository memberRepository;
    
        @BeforeEach
        public void beforeEach(){
            memberRepository = new MemoryMemberRepository();
            memberService = new MemberService(memberRepository);
        }

    테스트 코드에서 생성된 memberRepository가 memberService 함수에서 호출되도록 객체를 선언해주는 방식으로 해결!!

    JUnit

    단위테스트 프레임워크
    assertEquals(expected, actual)과 같이 두 개의 인자를 받아서 비교

            assertThrows(IllegalStateException.class, () -> memberService.join(member2));

    Assertj

    자바 테스트를 위해 풍부한 문법을 제공하고, 메서드 체이닝을
    통해 직관적인 테스트 흐름을 작성할 수 있도록 개발된 오픈소스 라이브러리
    assertThat(actual)과 같이 한 개의 인자를 요구하고 그 뒤로 메소드 체이닝을 함.

     assertThat(member.getName()).isEqualTo(findMember.getName());

    메서드 체이닝

    • 메서드가 객체를 반환하게 되면, 메서드의 반환 값인 객체를 통해 또 다른 함수를 호출할 수 있다.
      이러한 프로그래밍 패턴을 의미한다.

    중복 회원 예외 처리 예제

    @Test
        public void 중복_회원_예외(){
            //given
            Member member1 = new Member();
            member1.setName("spring");
    
            Member member2 = new Member();
            member2.setName("spring");
    
            //when
            memberService.join(member1);
            memberService.join(member2); // 실행 시 spring 값이 두번 입력되어 중복되므로 "이미 존재하는 회원입니다" 출력됨.
            IllegalStateException e = assertThrows(IllegalStateException.class, () -> memberService.join(member2));
    
            assertThat(e.getMessage()).isEqualTo("이미 존재하는 회원입니다.");
    }

    'TIL(Today I Learned)' 카테고리의 다른 글

    TIL 21일차(11.11)  (0) 2021.11.11
    TIL 20일차 (2021.11.10)  (0) 2021.11.10
    TIL 18일차(2021.11.8)  (0) 2021.11.08
    TIL 17일차(2021.11.07)  (0) 2021.11.07
    markdown이란?  (0) 2021.11.03
Designed by Tistory.