TIL-20210704~10

2021. 07. 06.

07.04~05

모의면접

브라이언이 모의 면접을 해주셨다. 사실 잘 생각해보면 준비가 하나도 안 되어서 면접이 의미 없을 수도 있었는데, 면접을 제대로 본 적이 없기에 일단 신청해봤었다. 사실 많은 분들이 지원하실줄 알았는데, 그게 아니어서 걱정이 살짝 되기도 했다. 그럼에도 카카오페이 과제에 집중하느라 제대로 준비하지 못했는데, 뭐 어찌 뙜건 얻은게 많다.

그 동안 면접에 대해 너무 안일하게 생각하고 있었던게 아닌가 하는 생각이 많이 들었다. 자기소개부터 시작해서 호눅스가 항상 말해주던 자신의 언어로 개념을 설명할 수 있어야 한다는 말을 왜 반복해서 해주셨는지 알 수 있었다. 거기에 준비도 안 되어 있는데, 개념까지 부족하니 나도 모르게 위축되고 그러다 보니 태도도 별로 좋아보이지 않았을 것이다. 그 외에 모르는 것을 함께 질문해가며 알아가는 것도 단박에 되기는 힘들다는걸 알게 됐다. 면접 리뷰나 가이드 같은걸 들을 때는 '아~ 저거 당연히 저렇게 해야지~' 이렇게 생각을 했는데, 막상 하니 쉽지가 않다. 무엇보다도 그런 식으로 어필할 수 있는 기회인지도 여유가 없으니 알기가 힘들었다.

앞서 얘기했지만, 매번 코테에서 떨어지다보니 기술 면접을 제대로 볼 기회가 없었는데, 너무 좋은 경험을 한 것 같다. 이번에 안 해봤으면 코테 붙고도 뭘 해야될지 몰라서 많이 헤멨을 것 같다. 문제는 이제 뭘 해야될지 아니 부담이 커지는건데, 열심히 해야지~ ㅎㅎㅎ..

네이버웹툰 코테

  • 이번 코테는 좀 쉬웠던 것 같다. 코쿼 막바지부터는 코테를 거의 보지 않아서 간만에 보는 것이었는데도 할만했다. 다만, 마지막 문제 접근이 꽤 어려웠는데, 정답이 뭔지 모르겠다.
  • 끝나고 Dan과 얘기를 좀 해봤는데, 모르는 문제는 효율성 떨어지더라도 100퍼센트 돌아가는 답을 빨리 찾아놓고 생각하는게 좋다고 한다. 그 동안 내가 풀이할 수 없는 문제라 버리는 문제가 많았는데, 이렇게라도 일단 풀어놓고 시작하면 장점이 꽤 있을 것 같다. 써먹어봐야겠다. 이외에도 카카오페이 문제를 보며 인수테스트와 레디스에 관한 얘기를 들었는데, 당시에는 와닿지 않았지만 약 10시간 정도 후에 무슨 말인지 깨닫게 됐다.

카카오페이 과제 5일차(마지막)

  • 어제 필요한 부분은 다 완성했고, 오늘은 인수테스트를 짜볼지 혹은 mysql로 마이그레이션을 할지 선택을 해야했다. 이래저래 생각해보다가 지금까지 단위테스트 해놓은게 아까워 인수테스트를 하기로 했다. 금방 끝날 줄 알았는데 고난의 시작이었다.

    코쿼 프로젝트를 하며 삽질을 꽤 해봤기 때문에 틀 잡고 테스트 짜는 것 자체는 크게 어렵지 않았다. 하지만 문제는 테스트가 제대로 돌아가지 않았다. 단위 테스트에만 의존하다보니 프로그램 자체가 제대로 돌아가지 않는 것을 놓쳤던 것이다.

    가장 먼저 찾아낸 것은 nano second 표현 방법과 관련된 것이었다. 나는 "2021-07-06T04:56:00.055" 와 같은 식으로 입력을 했다고 생각했는데, 결과가 그렇지 않았다. DB에 들어갈 때 부터 문제가 있었는데, 알고보니 내가 모르고 써서 문제였던 것이다. 다른 날짜 프레임워크나 언어도 마찬가지겠지만, LocalDateTime.of(year, month, date, hour, min, sec, nano sec)과 같이 입력을 한다. 여기서 nano sec은 000, 000, 000과 같이 구성되어 입력도 똑같이 000000000의 형태로 해줘야 하는데, 이 부분을 놓치고 055로만 입력을 해주고 있었다. 왜 그런지는 구현을 뜯어봐야 알겠지만(사실 이해가 안 된다), 어찌됐건 55000000 처럼 입력해야 내가 의도한 값이 나온다. 이외에도 앞에 0은 빼줘야 한다. 예를들어 055000000 는 다른 결과가 나온다.

    둘 째로 문제가 발생했었던 LinkedHashSet의 순서가 내가 생각한 것과 다르게 나오는 것이었다. 분명 DB에 잘 들어갔고, 쿼리도 제대로 됐는데 결과가 맞지 않았다. @OrderBY를 붙여주는 것으로 해결했는데, 그럼에도 인스턴스는 PersistSet이었다. 이 것도 구현을 좀 살펴봐야 더 어려운 문제가 발생했을 때 대응이 가능할 것 같다.

    셋 째로 설계상 오류가 있었는데, 우선 관계 테이블의 제약에 제대로 걸리지 않았다. 복합 유니크 및 NotNull 제약을 걸어주고 나니, 애초에 서비스 로직의 흐름 자체가 잘못됐다는 것을 꺠달았다. 너무 기본적인 것인데, 목업 테스트로 처리하니 제대로 캐치 하지 못했던 부분이었다. 한 번에 문제를 처리할까 하다가 인수테스트와 단위테스트의 이러한 차이점을 좀 더 느껴보려고 단위테스트를 통과할 정도로만 로직을 짜놓고 인수테스트로 넘어갔다. 결국 정확한 로직은 인수테스트를 거쳐야 완성이 됐는데, 이렇게 되니 단위 테스트에 대해 생각을 다시 해보게 됐다.

    마지막으로 테스트 데이터에 대한 문제가 있었다. 통합테스트 케이스 시나리오를 짜다보면 DB에 종속적이게 되는 경우가 생긴다. 단순 조회야 상관없겠지만, 삽입 수정 삭제가 들어가는 테스트를 통합테스트로 진행하게되면 DB에 있는 값이 변한다는 것이기 떄문에 각 테스트에서 사용하는 값이 매번 달라질 수 있다. 하지만 해당 테스트의 세팅은 해당 테스트에 맞도록 되어있는 것이 훨씬 편하다. 가장 큰 문제는 그렇게 하지 않으면 테스트 간의 종속성이 생겨버린다. 예를 들어 조회를 테스트 해보고 싶으면 삽입 테스트의 다음 번에 위치해야 한다는 점이다.

    나의 경우도 마찬가지였는데, 전체 조회 테스트가 입력 테스트 이후에 이루어지다보니 내가 알 수 없는 결과로 이어졌다. 그러다보니 DB를 초기화 해줄 방법을 찾게 됐는데, 처음에 트렌젝션 어노테이션을 붙여봤지만 제대로 동작하지 않았다. 내가 제대로 이해하지 않고 그냥 뭔지만 아는 정도로 사용을 하다보니 문제가 됐던 것 같다. 모의 면접때도 질문 받았던 것이긴 하지만 얼른 공부를 해봐야 할 것 같다. 결국 DB에 값을 직접 넣어주는 방법을 선택했다. 이 것도 처음에는 쉽지 않았는데, JPA에서 업데이트 된 값을 제대로 찾을 수 없다는 문제가 계속해서 발생했기 떄문이다. 영속성 컨텍스트의 성질과 관계가 있는 문제인 것 같은데, 이 부분도 따로 공부를 해봐야 할 것 같다. 그리고

  • 단위 테스트에 대해 생각을 다시 해봤다고 했는데, 단위테스트가 필요 없는 것은 아니다. 이번에도 리팩토링이나 로직 수정을 할 때 많은 도움을 받았다. 그런데 항상 단위테스트를 하면서 느끼는 점이 있는데, 가끔 단위테스트 내부에 로직이 들어가버리는 경우가 생긴다. 처음에는 테스트 단위가 너무 크니 좀 더 세부적인 테스트로 각각의 로직을 검증할 수 있도록 수정을 해야 한다고 생각했다. 틀린 것은 아닌 것 같고, 효과도 있었다. 그렇게 되면 해당 레이어에서는 진짜 그 레이어의 역할을 제대로 수행하는지만 테스트 할 수 있다. 어제 느꼈던 컨트롤러 단위 테스트의 역할과 비슷한 느낌인 것 같다.

    그리고 JPA테스트를 하면서 느꼈던 부분도 마찬가지일 것이다. 어디선가는 로직에 대한 검증이 필요한데, 단위테스트는 해당 단위만을 테스트해야 하기 때문에 여러 단위들이 모이는 부분에 대한 테스트는 힘들다. 물론 합쳐지는 포인트마다 테스트를 짤 수 있겠지만 사실상 그러다보면 통합테스트와 차이가 없어지는 것 같다. 차이점이 있다면 엔드포인트 정도? 엔드포인트가 다르기 때문에 클래스의 래핑이나 표현이 조금 달라지긴 하지만 어쨌든 테스트 해야하는 알맹이는 같다. 이런 점 때문에 ATDD가 생겨난게 아닌가 하는 생각이 들었다. 조만간 ATDD도 공부를 해봐야겠다. 테스트가 고되지만 중요하다고 생각하는데, 어렵지만 알아갈 수록 재밌는 것 같다. 예전에 엑셀로 관리하던 테스트 문서의 트라우마가 남아서 그런 것일 수도 있겠다...

  • 레디스 사용 용도를 찾지 못하고 있었다. 세션 공유를 통한 사용자 인증 정보 정도? Dan도 팁을 줬던 부분이지만, 잘 변하지 않는 부분을 캐싱해두고 사용하면 좋을 것 같다. 사용자 정보도 두고 쓰면 좋을 것 같지만, 비싼 자원이기 때문에 꼭 필요한 것만 넣어주는 것이 좋다고 한다. 당연한 얘기긴 하다. 어쨌든 로직을 바꾸며 생각을 다시 해보니 잘 변하지 않는 값을 계속해서 호출하며 확인하게 됐다. 이 부분에서 캐싱이 필요하구나 라는 생각을 해보게 됐다. 오전 11시 제출이라 시간이 빠듯하여 여기까지 구현은 못 했는데, 좀 더 찾아보고 마저 구현을 해봐야겠다.
  • 거의 24시간 깨어 있어서 월요일에는 레디스 공부하려다가 푹 쉬었다.

07.06

  • 테스트 커버리지 100% 라는 영상을 봤다. 실제로 프로젝트의 커버리지를 100 퍼센트까지 끌어올렸다고 한다. 이번에 통합테스트를 짜면서도 느꼈던 부분이지만, 스프링 컨텍스트 초기화 비용이 꽤나 크게 느껴진다. 프로젝트 규모가 이렇게 작은데도 체감이 조금 되는데 큰 경우는 테스트 할 때마다 고역일 것 같다. 해당 영상에서 그런 것 까지 최적화 한 내용을 공유해주는데, 아직 모두 따라할 필요는 없겠지만 두고두고 지침으로 삼을 만한 영상인 것 같다. 댓글은 투기장이 열렸는지 닫혀있었는데 좀 아쉽다.
  • 카카오페이 과제는 일지 형식이나 후기 형태로 정리해볼 수 있을 것 같다.

07.07~08

휴식

07.09

카카오페이 과제에 레디스를 붙여보기로 했다. 과제 막바지에 생각해봤던 레디스를 활용해서 캐싱하는 것인데, 쓰기 쉽게 나와있어 구현 자체는 어려울 것 같지 않다.

docker로 redis 설치

  • docker의 이미지 뒤에 붙이는 alpine, buster 등의 접미어는 os를 적어준 것이다. 그 중 많이 쓰이는 alpine은 아주 경량화된 os라고 한다. https://stackoverflow.com/questions/52083380/in-docker-image-names-what-is-the-difference-between-alpine-jessie-stretch-an
  • -p 명령어는 publish를 뜻하는 것이다. host에 노출시킬 포트를 뜻한다. 그렇게 되면 호스트(도커가 깔린 컴퓨터)에 해당 포트가 활성화 된 것을 확인할 수 있다. 즉 로컬호스트로 직접 연결이 가능해진다. 이는 도커 프록시가 연결을 감지해주기 때문이라고 한다.
  • 이미지를 받아오는거라 설치라기 하기는 애매하지만 레디스보다는 도커가 어려웠다. 예전에 레디스 설치도 꽤 복잡했던 것으로 기억하는데, 한 번 시도해봐야겠다.

spring boot redis

RedisTemplate과 RedisRepository를 제공해준다. 인스턴스로 Lettuce와 Jedis를 사용할 수 있는데, Lettuce가 기본으로 내장돼있다고 한다.

RedisTemplate은 수동으로 키를 지정해주는 것이고, RedisRepository는 Spring Data에서 제공하는 Repository인터페이스처럼 엔티티 타입과 ID타입을 지정할 수 있다.

TODO

  • MockMvc 분석

    • 테스트 기본 인코딩이 이상함.
  • 잭슨 리퀘스트 바디 파싱 분석

    • request시에 생성자 인식 못 함.
  • 스프링 절대경로 서버주소 어떻게 인식하는지(어떻게 nginx 주소를 알 수 있나)?
  • 우아한 객체지향
  • 이런 REST로 괜찮은가
  • 알고리즘

  • OS

    • 4.5 문서 마무리
    • 4.6
  • AWS 강의듣기

    • IAM 정리하기
  • 데브독스 넥스트(7월 첫주)
  • 엘라스틱서치
  • 서브넷 구분
  • s3 이용

    • 구현하기
  • 깃헙액션으로 aws 배포
  • classForName 테스트
  • sticky session
  • clustered index
  • ACID
  • LocalDateTime.of nano sec
  • 트랜잭션
  • 영속성컨텍스트(와 트랜잭션)
  • ATDD
  • 인수테스트 데이터 삽입(초기화)
  • 인텔리j 이클립스 해쉬함수 생성 차이점
  • redis
  • redis repository equals와 어노테이션 확인해보기
  • 블로그

    • 디렉토리 구조 수정
    • blogs/{yyyy}/{mm}/{postname}
    • generator 수정 -[ ] 각 분류 별로(til, post 등) 작성할 수 있도록 -[ ] til에 날짜별 구분과 toc 추가해주도록
    • 허스키 수정
    • 현재 파이프라인이 제대로 동작하지 않아서 수정 날짜 후처리가 되지 않음
  • 면접

    • 일했던 것 까지적으려면, 이력서에 사용했다고 명시한 기술에 대해 더 깊은 이해.
    • 쿼츠, 스캐줄링
    • 스프링 배치, 배치
    • 멀티파트
    • 멀티파트 리졸버
    • 시큐어코딩
    • 오라클이나 postgresql

      • 기본적인 차이점이나 장단은 숙지
      • 오라클 mysql 차이 공부하고 브라이언에게 다시 물어보기
      • 공간쿼리까지 준비하면 더 좋을듯...
    • 운영체제, 네트워크, 데이터베이스 등 컴퓨터공학 기본지식을 재점검
    • “신입개발자 면접 문제” 찾아서 충분히 준비(특히 SOLID, ACID 같은 기본 키워드)
    • 가장 좋아하는 정렬을 비롯하여 시간복잡도 log, n2 인 것들 각각 한가지씩은 숙지해 두시기 바랍니다(탐색도 알아두시면 좋습니다)
    • 자기소개는 충실히 준비
    • 화법 연습
    • 모르는 부분에 키워드 중심으로 힌트를 요청하면 좋겠습니다(“~~에 대한 말씀이신가요? 제가 잘 모르겠는데 키워드 몇 개만 주실 수 있으실까요?“)
    • 말을 확실하고 분명하게
    • 말끝을 흐리지 않게 항상 조심
    • 분명한 어조로 답변
정대화
DaeHwa_Jeong@outlook.com

Powered with by Gatsby 2.0