CS과 GIT
JPA: 1대1 매핑 시 사용되는 @MapsId
- @MapsId는 JPA에서 1:1 관계를 맺을 때, 자식 엔티티가 부모 엔티티의 PK(Primary Key)를 자신의 PK이자 FK로 그대로 가져다 쓸 때 사용한다.
- 왜 사용하는가? (Shared Primary Key)
- 일반적인 외래키(FK) 관계에서는 자식 테이블이 별도의 ID(예: id=10)를 가지고 부모 ID(parent_id=1)를 컬럼으로 가집니다.
- 하지만 @MapsId를 쓰면 자식의 PK 자체가 부모의 PK가 됩니다.
- 테이블 구조 최적화: 별도의 PK 컬럼을 만들 필요가 없어 저장 공간이 절약됩니다.
- 데이터 정합성: 부모 하나당 자식 하나가 명확히 맵핑되며, 식별자가 일치하므로 관리가 편합니다.
TDD 주도 설계: Mock Test 진행 시 배운 점
@InjectMocks
- 테스트 대상이 되는 컨트롤러 객체를 가리킨다.
- @Mock으로 선언된 의존성이 이 객체에 자동으로 주입
- 예를 들면, @InjectMocks가 Controller가 되면 @Mock에는 Service가 들어가게 된다.
MockMvc
- 스프링 Mvc 동작을 재현해서 Http 요청/응답을 테스트하게 된다
MockUserPrincipalArgumentResolver
- 컨트톨러 메서드의 파라미터 중 @AuthenticationPrincipal과 같은 특별 처리가 필요한 인자에 자동 주입해주는 resolver
클린코드의 관점에서 오늘 배운 점
-
도메인 내 함수의 분리: AuthService에서 signup할 때 MemberGameStat도 같이 초기화해주는 게 정석임. 그러지 않으면 TierService에서 MemberGameStat에 해당하는 member가 없을 때 tierSerivce에서 build해줘야 하는 이슈가 발생함.
-
여러 곳에서 쓰이는 상수의 경우 클린코드로 바꿀 때: EnumType으로 빼는 방법도 있지만 클래스 내부에서 static final String으로 작성해주는 방법이 있다. 이러면 해당 상수가 여러 곳에서 쓰일 때, 상수의 값을 변경하는 경우 모든 곳을 찾지 않고 상수 선언한 곳만 수정하면 된다.
git 원격에 올라가 있는 브랜치 땡겨와서 쓰는 법
git fetch -all하면 원격에 있는 모든 변경사항을 땡겨온다. 또는git remote update로 원격 브랜치를 가져올 수 있다.git remote -r은 원격 브랜치만 조회하는 방법. 이 중에서 switch할 브랜치의 이름을 복사해둔다.git checkout -t {브랜치명}를 써서 해당 브랜치로 스위치 가
CS: IP계층의 한계
IP계층의 한계가 무엇일까요?
- 신뢰할 수 없는 통신과 비연결형 통신을 수행한다
- 그럼 이걸 어떻게 보완할 수 있을까?
- IP계층의 보완: 신뢰할 수 있는 통신과 연결형 통신을 가능하게 하는 TCP 프로토콜 사용
- 응용 계층의 보조: 포트 번호를 통해서 애플리케이션 프로세스를 식별한다
IP계층의 문제점
- 신뢰할 수 없는 (비신뢰성) 프로토콜 == 최선형 프로토콜
- IP프로토콜이 패킷이 수신지까지 제대로 전송되었다는 보장을 해주지 않는다.
- 데이터의 손상, 중복 패킷 확인 안 함, 재전송 안함, 순서대로 패킷 도착 보장 안함
- 비연결형 통신
- 송수신 호스트 간에 사전 연결 수립 작업을 거치지 않음
- 그냥 수신지를 향해서 패킷을 보내기만 함
그럼 왜 이런 문제점이 있음에도 사용할까?
- 모든 경우에 신뢰성 있는 전송이 필요한 게 아니라서 성능을 보장하기 위함인데
- 모든 패킷이 제대로 전송되었는지 확인하고 호스트 간에 연결을 수립하는 작업 ↔ 패킷의 빠른 송수신과 대비되는 작업 ⇒ 그래서 더 많은 시간, 대역폭, 부하를 초래할 수 있음
- 그러니까 실시간 동영상 스트리밍 서비스는 패킷이 몇 개 손실되어도 ㄱㅊ고 금융 서비스는 신뢰성 있는 전송이 필수적임
- 그래서 이런 차이가 있는 걸 네트워크 계층의 상위 계층인 전송 계층에서 보장할 수 있게 함.
그럼 전송 계층의 특징은 무엇일까?
- TCP에 해당하는 이슈
- 연결형 통신을 보장한다. 이건 곧 송수신하기 전에 연결을 수립하고, 송수신 중에는 유지, 끝나면 연결을 종료할 수 있다
- 신뢰성 있는 통신을 보장한다. TCP는 재전송을 위한 오류 제어, 흐름 제어, 혼잡 제어 등 다양한 기능을 제공함
- UDP의 경우:
- 신뢰할 수 없는 통신, 비연결형 통신이라 얘는 TCP보다는 빠른 전송을 가능하게 함