항해99 기술면접 대비

23.11.16 항해 99 16기 기술면접 대비

김용글 2023. 11. 16. 21:05

1. TDD에 대해서 설명해주세요.

 1) TDD 란?

     Test Driven Development 의 약자로 테스트 주도 개발이라고 한다

     작은 단위의 테스트 케이스를 작성하고 이를 통과하는 코드를 추가하는 당계를 반복하여 구현하며

     디자인 이후 테스트 코드 작성 한 후 에 실제 코드를 작성하는 것

 2) 장점

     (1) 디버깅 시간의 단축

          데이터가 잘못 나온다면 DB 문제인지 비지니스 레이어문제인지 UI 문제인지 실제 모든 레이어들을 전부 디버깅

          해야 하지만 TDD 의 경우 자동화 된 유닛테스팅을 전제하므로 특정 버그를 손쉽게 찾을 수 있다

     (2) 코드가 내 손을 벗어나기전에 가장 빠르게 피드백 받을 수 있다

          개발 프로세스에서는 보통 인수테스트를 한다 이미 배치된 시스템을 대상으로 클라이언트가 의뢰한

          소프트웨어가 사용자 관점에서 사용할 수 있는 수준인지 체크하는 과정

          이미 90% 이상 완성된 코드를 가지고 테스트 하기 때문에 문제가 발생해도 정확한 원인이 무엇인지 판단하기

          힘들다

          하지만 TDD 는 기능 단위로 테스트를 하기 때문에 피드백 받는 것이 가능하다

     (3) 재설계 시간 단축

          개발자가 지금 무엇을 해야하는지 분명히 정의하고 개발을 시작하게 된다 또한 다양한 예외 사항에 대해

          생각해볼 수있어 개발 진행 중 소프트웨어의 전반적인 설계가 변경되는 일을 방지할 수 있다

     (4) 추가 구현 용이

          개발 완료된 소프트웨어에 어떤 기능을 추가할 때 가장 우려가 되는 점은 해당 기능이 기존 코드에 어떤 영향을

          미칠지 알지 못하는 것인데 TDd 의 경우 자동화된 유닛 테스팅을 전제하므로 테스트 기간을 획기적으로 단축

          시킬 수 있다

 2) 단점

     (1) 생산성의 저하

          일반적인 개발 방식에 비해 대략 10~30% 정도로 늘어난다 SI 프로젝트에서는 소프트웨어의 품질보다 납기일

          준수가 훨씬 중요하므로 TDD 방식을 잘 사용하지 않는다

     (2) 구조에 얽매인다

          어려운 예외가 생길 수 있는데 그것 때문에 고민하는 순간이 찾아오게 된다. 원칙을 깰 수는 없고 꼼수가 있긴한데

          그 꼼수를 위해 구조를 바꾸자니 아닌거 같고 테스트는 말 그대로 테스트일뿐 실제 코드가 더 중요한 상황인데도

          불구하고 테스트 원칙 때문에 쉽게 넘어가지 못하는 그런 경우가 생길 수 있다

 

2. 프로세스와 쓰레드에 대해서 설명하고 그 차이에 대해서 설명해주세요.

 1) 프로세스 

     프로그램을 실행시켜 정적인 프로그램이 동적으로 변하여 돌아가고 있는 상태 즉, 컴퓨터에서 작업중인 프로그램

 2) 쓰레드

     하나의 프로세스 내에서 동시에 진행되는 작업갈래, 흐름의 단위

 3) 차이

     (1) 프로세스는 최소 하나의 스레드를 보유하며 각각 별도의 주소공간을 독립적으로 할당 받음

          (Code, Data, Heap, Stack)

     (2) 쓰레드는 이중에 Stack 만 따로 할당 받고 나머지 영역은 쓰레드끼리 공유함

 

3. 멀티 프로세스와 멀티 쓰레드의 특징에 대해 설명해주세요.

 1) 멀티 프로세스

     운영체제에서 하나의 응용프로그램에 대해 동시에 여러개의 프로세스를 실행할 수 있게 하는 기술

     예) 웹 브라우저의 상단 탭이나 새창 각브러우저 탭은 같은 브라우저 프로그램 실행이지만 각각 다른 사이트 실행을

           행하기 때문

     (1) 장점

           a) 프로그램 안정성

               각 프로세스가 독립적인 메모리 공간을 가지므로 한 프로세스가 비정상적으로 종료되어도 다른 프로세스에

               영향을 주지 않음

           b) 프로그램 병렬성

               멀티 프로세스와 여러개의 CPU 코어를 활용해 둘의 시너지를 합쳐 다중 CPU 시스템에서 각 프로세스를

               병렬적으로 실행하여 성능을 향상 시킬 수 있다

               예) 비디오 인코딩과 같은 작업을 여러개의 코어나 CPU 에 분산시켜 빠르게 처리 가능

           c) 시스템 확장성

               각 프로세스가 독립적이므로 새로인 기능이나 모듈을 추가하거나 수정할 때 다른 프로세스에 영향을 주지

               않으므로 시스템 규모를 쉽게 확장 할 수 있다

     (2) 단점

           a) Context Switching Overhead

               멀티 태스킹을 구성하는데 핵심기술인 Context Switching 과정에서 성능 저하가 올 수 있다 

               프로세스를 Context Switching 하면 CPU 는 다음 프로세스 정보를 불러오기위헤 메모리를 검색하고,

               CPU 캐시 메모리를 초기화하며 프로세스 상태를 저장하고 불러올 데이터를 준비해야 하기 때문에 오버헤드가

               발생할 수 있게 된다

           b) 자원 공유 비효율성

               독립적인 메모리 공간을 가지므로 결과적으로 메모리 사용량이 증가하게 된다

 2) 멀티 쓰레드

     하나의 프로세스 안에 여러개의 쓰레드가 있는것 따라서, 하나의 프로그램에서 두가지 이상의 동작을 동시에

     처리하는 것이 가능해짐

     예) 웹서버가 대표적 사용자가 서버 DB에 자료를 요청하는 동안 브라우저의 다른 기능을 사용하는 것

     (1) 장점

           a) 프로세스보다 가벼움

               프로세스보다 용량이 가볍다 프로세스 내에서 생성되기 때문에 실행환경을 설정하는 작업이 매우 간단하여

               생성 및 종료가 빠르다 

           b) 자원의 효율성

               하나의 프로세스 내에서 여러 개의 스레드를 생성되기 때문에 Heap 영역과 같은 공유 메모리에 대해 쓰레드간

               자원 공유가 가능하다 이를 통해 프로세스 간 통신을 사용하지 않고도 데이터 공유가 가능하기에 자원의

               효율적인 활용이 가능해 시스템 자원 소모가 줄어듬

           c) Context Switching 비용 감소

               쓰레드에도 Context Switching Overhead 가 존재하지만 상대적으로 프로세스보다 훨씬 낮아 비용이 낮다

           d) 응답 시간 단축

               앞의 장점을 종합해보면 쓰레드 간의 통신이나 자원공유가 더욱 용이하며, 프로세스보다 가벼워 .

               Context Switching Overhead 도 작다 따라서 멀티 스로세스보다 응답 시간이 빠르다

     (2) 단점

           a) 안정성

               기본적으로 하나의 쓰레드에서 문제 발생시 다른 쓰레드들도 영향을 받아 전체 프로그램이 종료될 수 있다

           b) 동기화로 인한 성능저하

               멀티 쓰레드 모델은 여러개의 쓰레드가 공유 자원에 동시 접속할 수 있기 때문에 동기화 문제가 있을 수 있다 

               여러 쓰레드가 동시에 한 자원을 변경해버린다면 의도되지 않은 엉뚱한 값을 읽어 서비스에 치명적 버그가

               생길 수 있다 따라서 쓰레드간 동기화는 필수 기술이다

           c) 데드락(교착 상태)

               다수의 프로세스나 쓰레드가 서로 자원을 점유하고 다른 프로세스나 쓰레드가 점유한 자원을 기다리는

               상황에서 발생하는 교착 상태이다 여러개의 쓰레드가 서로 대기하면서 무한징 기다리게 되는 무한 루프와

               같은 증상이다

           d) 디버깅의 어려움

               여러개의 쓰레드가 동시에 실행되기 때문에 각 쓰레드의 동작을 추적하기 어려울 수 있다 코드를 디버깅하는

               도중 다른 쓰레드가 실행되어 예기치 않은 결과가 발생 할 수 있고 어떤 쓰레드가 어떤 자원에 접근하고,

               어떤 순서로 실행되는지 등을 파악하기 어려울 수 있다

 

* Context Switching?

   현재 진행하고 있는 Task(프로세스, 쓰레드) 의 상태를 저장하고 다음 진행할 Task 의 상태값을 읽어 적용하는 과정

 

4. 쿼리 최적화에 대해 설명해주시고 방법에 대해 설명해주세요.

 1) 쿼리 최적화란?

     DB 에서 쿼리(DB 에서 정보를 검색, 조작하거나 분석하는 명령어) 를 가장 효율적으로 실행하기 위해 실행 계획을

     최적화 하는 것

 2) 쿼리 최적화 방법

     (1) SELECT * 사용금지 

          칼럼만 조회하는 가장 쉬운 방법 * 을 사용하여 필요하지 않은 칼럼을 조회해야 하는 경우 불필요한 리소스를 소모함

     (2) LIKE 검색시 와일드카드(%) 끝에 작성

          와일드카드가 시작부분에 있는 경우 인덱스를 활용하지 않는다 따라서 DB 는 모든 레코드를 검색하므로

          검색속도가 느려진다

     (3) 중복제거

           UNION 과 DISTINCT 를 같이 사용하지 않아야 한다 UNION 에는 중복 값을 제거하는 기능이 존재하므로

           DISTINCT 와 함께 사용할 필요가 없다

           DISTINCT 와 GROUP BY 를 같이 사용하지 않아야 한다 GROUP BY 절에 입력된 칼럼을 그룹화 함으로

           DISTINCT 와 함께 사용할 필요가 없다

     (4) ORDER BY 금지

           RDBMS 마다 다르지만 서브쿼리에서 ORDER BY 를 사용하는 경우 많은 비용이 발생

     (5) IN 대신 EXISTS 사용

           WHERE 문에서 서브쿼리 값을 확인하는 경우 IN 또는 EXISTS 를 사용할 수 있다. IN 과 EXISTS 는 검색 결과에

           따라 어느 것을 사용할 지 결정해야 한다 서브쿼리의 결과가 많으면 EXISTS 가 나은 성능을 제공하며 그렇지

           않으면 IN을 사용하는 것이 좋다

           EXISTS 는 일치하는 항목이 발견되는 즉시 검색 프로세스를 종료하지만 IN 은 모든 항목을 비교하기 때문

     (6) WHERE 문에 함수 사용 제한

           WHERE 문에 컬럼이 인덱스로 잡혀 있을 때 함수와 함께 사용되면 인덱스가 깨지므로 검색속도가 느려진다 

           인덱스가 잡혀있는 칼럼은 WHERE 문 또는 JOIN 에서 함수와 함께 사용하는 것을 피해야 함

     (7) 암시적 변환 금지

           암시적 변환은 DB 에서 값을 비교할 때 데이터 값이 다른 경우 DB 에서 자동으로 타입을 변환 후 값을 비교하는

           방식 불필요한 리소스가 소모되므로 동일한 타입으로 값을 비교하는 것이 좋다

 

5. DB 로직 최소화를 하려면 어떻게 해야 할까요?

 1) 일관된 데이터 모델링

      DB 테이블과 엔티티를 일관성 있게 설계, 중복 데이터를 피하고 정규화를 적용하여 데이터 중복을 최소화 하며

      데이터 무결성 유지

 2) 비지니스 로직 분리

      DB 에 직접적인 비지니스 로직을 내장 시키는 것을 피하고, 서비스나 애플리케이션 레이어에서 비지니스 로직을

      처리하도록 분리

 3) 조회 최적화

      쿼리를 작성할 때 필요한 데이터만 조회하고 JOIN 등 복잡한 연산 최소화

      필요한 데이터를 미리 계산하여 캐싱하거나, DB 뷰를 활요하여 미리 계산된 결과를 조회하는 방식을 고려

 4) 인덱스 활용

      필요한 컬럼에 인덱스를 생성하여 검색 성능 향상

      하지만 과도한 인덱스 생성은 쓰기 성능에 부정적 영향을 미칠 수 잇으므로 적절한 인덱스를 선택하고 관리

 5) 쿼리 캐싱

      자주 사용되는 쿼리 결과를 캐시하여 반복적인 쿼리 실행을 피하고 성능을 향상시킴, 캐싱시 데이터 갱신 주기와

      데이터의 유효성 고려해야함

 6) 트랜잭션 사용 최소화

      트랜잭션은 데이터의 일관성과 무결성을 유지하기 위해 필요하지만 필요하지 않은 범위애서 사용을 피하고 최소화

 7) 배치 처리

      대량의 데이터를 처리할 때는 배치 작업을 활용하여 효율적으로 처리한다. 적절한 커밋 주기와 배치 크기를

      설정해서 성능을 최적화

 8) 프로시저 및 함수 활용

      DB 내부에서 로직을 처리하는 스토어드 프로시저나 함수를 사용하여 애플리케이션과 DB 간의 통신을 최소화 하고

     성능 개선

 9) 데이터 캐싱

      자주 사용되는 데이터를 애플리케이션 내에 캐시하여 DB 접근을 줄이고 성능을 향상시킴

 10) 적절한 인덱스와 제약조건 활용

      DB 테이블의 인덱스와 제약 조건을 적절하게 활용하여 데이터 무결성을 보장하고 검색 성능 향상

  

6.  테스트 코드에 대해서 아는 대로 설명해주시고 활용 경험에 대해서 답변해주세요.

 1) 테스트 코드란 

     내가 작성한 메서드가 실제로 제대로 동작하는 테스트하는 코드

 2) 테스트 코드 종류

     (1) 단위 테스트 

          개별적인 코드 단위(보통 함수, 메서드) 가 의도한 대로 작동하는지 확인하는 과정

     (2) 통합 테스트

          서로 다른 모듈들 간의 상호작용을 테스트하는 과정 

 3) 테스트 코드 작성 이유

     (1) 요구사항의 기능적인 항목들을 정리하고 코너 케이스를 찾게 되며 이는 문서의 역활을 수행함

     (2) 코드 수정 후에도 기능이 정상적으로 작동하는지 검증 할 수 있다

     (3) 의존성이 높은 부분을 개선하면 코드 품질이 향상된다

 4) 활용 경험

     이번 최종 프로젝트를 진행하면서 댓글과 대댓글에 대한 Controller 와 Service 부분에 테스트코드를 작성했다

     댓글 과 대댓글이 어려운 코드는 아니었어서 테스트 코드를 작성하는데에도 큰 문제는 없었다

     하지만 처음으로 작성해보는 코드여서인지 트러블슈팅도 있어서 작성해보았다

    https://nodaji1012-hanghae99-16.tistory.com/95

 

23.10.25 항해 99 16기 실전 프로젝트 트러블 슈팅

CommentsController 의 테스트 코드를 작성하던 도중 트러블 슈팅이 발생했다 1) 첫번재 코드 더보기 (1) MockSpringSecurityFilter // Spring Securitiy 필터 public class MockSpringSecurityFilter implements Filter { @Override // 필

nodaji1012-hanghae99-16.tistory.com