오늘 할 일
- 프로그래머스 문제 풀기
- 테스트 코드 관련 학습
- 기술 면접 질문 공부하기
오늘 배운 것
프로그래머스 문제 풀기
- 코드는 github repository에 있습니다. (https://github.com/chaning49/Algorithm)
- Lv 2. 이진 변환 반복하기
테스트 코드 관련 학습
개발한 기능을 실행해서 테스트 할 때
- 자바의 main 메서드를 통해서 실행하거나,
- 웹 애플리케이션의 컨트롤러를 통해서 해당 기능을 실행한다.
이러한 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기 어렵고 여러 테스트를 한 번에 실행하기 어렵다는 단점이 있다.
→ 자바는 JUnit이라는 프레임워크로 테스트를 실행해서 이러한 문제를 해결한다.
- 테스트용 패키지는 보통 실제 기능이 동작하는 패키지의 이름과 똑같이 만든다.
src/test/java
하위 폴더에 repository 패키지를 생성한다.- 테스트할 클래스의 이름 뒤에 Test를 붙여서
~Test.java
형태로 만드는 것이 관례이다. - public으로 하지 않아도 됨 → 다른데서 호출하지 않으니까!
- 테스트할 클래스의 이름 뒤에 Test를 붙여서
@Test
어노테이션을 사용하면 기능을 실행할 수 있다.save()
결과 확인하기System.out.println("result = " + (result == member));
으로 출력문을 통해 확인할 수 있지만 해당 방법은 비효율적이다.Assertions.assertEquals(expected, actual);
을 사용하면 결과를 확인할 수 있다. expected에 기대값을 넣고 actual과 비교하는 것이다.org.junit.jupiter.api.Test;
를 import 해서 사용한다.Assertions.assertThat(member).isEqualTo(result);
으로 사용하는 것이 문장 읽듯 읽혀서 이해가 빠르다.org.assertj.core.api.Assertions;
를 import해서 사용한다. Assertions 부분에 option + enter를 입력해서 static import를 사용하면 `assertThat(member).isEqualTo(result);` 형태로 사용이 가능하다.
findByName()
결과 확인하기- ⭐ Test Case는 순서와 상관없이 정상 동작하도록, 의존관계 없이 설계해야 한다. 즉 테스트가 하나 끝나면 데이터를 클리어할 수 있도록 해주어야 한다. → 하나의 테스트가 끝날 때마다 저장소나 공용 데이터를 깔끔하게 지워주어야 한다.
@AfterEach
어노테이션을 붙여줘서 각 메소드 동작이 끝난 이후에 처리를 해줄 수 있다.- MemoryMemberRepository 클래스에 clearStore()라는 메소드를 만들어 repository를 비워줄 수 있다.
→ Test Case의 장점은 클래스 레벨, 전체 클래스 레벨 단위로 테스트가 가능하다는 것이다.
- 테스트에서는 한글로 이름을 바꿔줘도 된다.
- given / when / then 문법
- 무언가 주어지고(given) ~를 실행했을 때(when), ~것이 실행되어야 한다.(then)
- new로 다른 객체의 인스턴스가 생성되는 것은 지양하고 같은 인스턴스로 테스트 해야 한다.
- memberService에서 사용하는 MemoryMemberRepository와 TestCase에서 만든 MemoryMemberRepository는 다른 인스턴스이다. static이 아닌 경우에는 DB가 다르게 인식될 것이다. → 테스트시 완벽하게 같은 환경에서 실행해야 한다.
- 해결방법: memberService에 생성자를 사용하여 외부에서 MemberRepository를 주입해준다. → DI(Dependency Injection)
기술 면접 질문 공부하기
- 세마포어와 뮤텍스의 차이에 대해 설명해보세요.
- 뮤텍스: 공유된 자원의 데이터 또는 임계영역 등에 하나의 프로세스나 스레드만 접근 가능하도록 공유 자원을 관리하는 방식이다.
- 세마포어: 공유된 자원의 데이터 또는 임계영역 등에 여러 개의 프로세스나 스레드가 접근 가능하도록 공유 자원을 관리하는 방식이다. 하나 이상의 프로세스 또는 스레드를 설정할 수 있으므로 뮤텍스와 같은 역할을 수행할 수 있다.
- 방식의 차이가 존재하는데, 뮤텍스는 key의 역할을 하는 객체를 두고 공유 자원에 락을 걸어서 해당 객체를 가진 프로세스나 스레드만 공유 자원을 이용할 수 있는 방식이다. 세마포어의 경우는 이용 가능한 프로세스 또는 스레드의 수(최대치)를 공통으로 관리하는 하나의 값을 통해 최대 허용치만큼의 프로세스/스레드가 동시에 공유 자원에 접근할 수 있다.
- 뮤텍스의 경우 공유 자원을 이용 중인 프로세스/스레드가 락을 풀어야 다른 프로세스/스레드가 공유 자원에 접근할 수 있지만 세마포어는 최대 허용치 내에서 각 프로세스/스레드가 값을 확인하고 변경할 수 있다.
- 출처 링크1: https://inpa.tistory.com/entry/%F0%9F%91%A9%E2%80%8D%F0%9F%92%BB-%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4-%E2%9A%94%EF%B8%8F-%EC%93%B0%EB%A0%88%EB%93%9C-%EC%B0%A8%EC%9D%B4#%ED%94%84%EB%A1%9C%EC%84%B8%EC%8A%A4_%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8_%EC%8A%A4%EC%9C%84%EC%B9%AD_vs_%EC%8A%A4%EB%A0%88%EB%93%9C_%EC%BB%A8%ED%85%8D%EC%8A%A4%ED%8A%B8_%EC%8A%A4%EC%9C%84%EC%B9%AD
- 출처 링크2: https://heeonii.tistory.com/14
느낀점
- 운영체제를 학교 다닐 때 더 열심히 할걸 하는 생각이 듭니다. 교수님의 수업 스타일이 안맞는 것과는 별개로 열심히 했어야 하는거더라구요 ㅎㅎ.. 그래도 정보처리기사 공부하면서 했던 내용이 생각나서 이해는 나름 잘 되고 있습니다.
내일 할 일
- 프로그래머스 문제 풀기
- 프로젝트 github 세팅하기
- 운동하기 - 웨이트 트레이닝
'TIL' 카테고리의 다른 글
TIL_20230623 (0) | 2023.06.23 |
---|---|
TIL_20230622 (0) | 2023.06.22 |
TIL_20230620 (0) | 2023.06.20 |
TIL_20230619 (0) | 2023.06.19 |
TIL_20230618 (2) | 2023.06.18 |