2024. 6. 25. 12:20ㆍ카테고리 없음
1 .ERD를 작성할 때 Relation은 무엇이며, Relation의 종류 3가지를 예시를 들어 설명해 주세요.
일대일 관계(One-to-One):
• 한 엔티티가 다른 엔티티와 오직 하나의 관계를 가지는 경우입니다.
• 예시: 사람(Person)과 여권(Passport) 간의 관계. 한 사람은 하나의 여권만 가질 수 있고, 한 여권은 한 사람에게만 속합니다.
일대다 관계(One-to-Many):
• 한 엔티티가 여러 다른 엔티티와 관계를 가지는 경우입니다.
• 예시: 부모(Parent)와 자녀(Child) 간의 관계. 한 부모는 여러 자녀를 가질 수 있지만, 한 자녀는 한 부모만 가질 수 있습니다.
다대다 관계(Many-to-Many):
• 여러 엔티티가 여러 다른 엔티티와 관계를 가지는 경우입니다.
• 예시: 학생(Student)과 수업(Class) 간의 관계. 한 학생은 여러 수업을 들을 수 있고, 한 수업은 여러 학생이 들을 수 있습니다.
2. 비밀번호 저장 시 Hash의 암호화 방식
Hash는 단방향 암호화에 해당합니다. 단방향 암호화는 입력 데이터를 고유의 출력 값으로 변환하여 저장하되, 출력 값으로부터 입력 데이터를 역산할 수 없는 방식입니다.
3. 비밀번호를 Hash해서 저장하는 이유
1. 보안 강화: 해커가 데이터베이스를 탈취하더라도 원래 비밀번호를 알 수 없습니다.
2. 무결성 보장: 비밀번호를 변경하지 않는 한 Hash 값도 변경되지 않습니다.
3. 안전한 인증: 인증 과정에서 입력된 비밀번호를 Hash하여 저장된 Hash 값과 비교함으로써 안전한 인증이 가능합니다.
--양방향은 언제 사용하는지?
- 금융 정보: 신용카드 번호, 은행 계좌 정보 등. 예를 들어, 결제 시스템에서는 신용카드 정보를 안전하게 저장하고, 결제 시에 복호화하여 사용해야 합니다.
- 의료 기록: 환자의 의료 정보는 민감한 데이터로 보호되어야 하며, 필요할 때 의료 전문가는 이 정보를 볼 수 있어야 합니다.
4. Access Token 노출 시 발생할 수 있는 문제점
1. 불법 접근: 공격자가 노출된 토큰을 이용해 사용자의 권한으로 시스템에 접근할 수 있습니다.
2. 데이터 유출: 민감한 사용자 데이터가 유출될 위험이 있습니다.
3. 권한 남용: 공격자가 악의적으로 사용자 권한을 이용해 시스템을 오작동시킬 수 있습니다.
5. Access Token 노출 문제 보완 방법
1. 짧은 유효기간 설정: Access Token의 유효기간을 짧게 설정하여 노출되더라도 악용 가능한 시간을 최소화합니다.
2. Refresh Token 사용: Refresh Token을 사용하여 Access Token이 노출되었을 때 새로 발급받을 수 있게 합니다.
3. 토큰 무효화: Access Token이 노출되었을 경우 신속히 무효화하는 방법을 마련합니다.
4. 모니터링 및 알림: 이상한 접근 시도를 모니터링하고 사용자에게 알립니다.
6. JWT 인증 방식: Cookie vs Header
• Cookie를 이용한 방식:
• 적합한 상황: 브라우저 기반 애플리케이션에서 세션 관리를 통해 자동으로 인증 정보를 관리할 때 적합합니다.
• 장점: CSRF 공격에 대비한 SameSite 속성을 설정할 수 있습니다.
• Header를 이용한 방식:
• 적합한 상황: 모바일 앱이나 비브라우저 환경에서 사용하기 적합합니다.
• 장점: CORS 문제를 피할 수 있으며, 보다 명시적으로 토큰을 전송할 수 있습니다.
7. 인증과 인가 무엇인지 예시를 설명해주세요
• 인증(Authentification): 사용자가 자신이 누구인지 증명하는 과정.
• 예시: 사용자가 로그인할 때 아이디와 비밀번호를 입력하는 것.
• 인가(Authorization): 인증된 사용자가 특정 자원에 접근할 권한이 있는지 확인하는 과정.
• 예시: 관리자 권한을 가진 사용자가 관리 페이지에 접근할 수 있는 것.
8. Transaction무엇이며 어떤경우에 사용을 하는지
Transaction은 데이터베이스 작업의 논리적인 단위로, 일련의 작업들이 모두 성공하거나 모두 실패하도록 보장합니다.
• 사용해야 하는 경우: 은행의 송금 작업처럼 여러 데이터 변경이 동시에 일어나야 하는 경우.
- 원자성(Atomicity) - 트랜잭션에 속한 각각의 문(데이터를 읽기, 쓰기, 업데이트 또는 삭제하기 위함)을 하나의 단위로 취급합니다. 문 전체를 실행하거나 그 문의 어떤 부분도 실행하지 않거나 둘 중 하나입니다. 이 속성이 있으면 예컨대 스트리밍 데이터 소스가 스트리밍 중에 갑자기 오류를 일으키더라도 데이터 손실과 손상이 방지됩니다.
- 일관성(Consistency) - 트랜잭션이 테이블에 변경 사항을 적용할 때 미리 정의된, 예측할 수 있는 방식만 취합니다. 트랜잭션 일관성이 확보되면 데이터 손상이나 오류 때문에 테이블 무결성에 의도치 않은 결과가 생기지 않습니다.
- 격리(Isolation) - 여러 사용자가 같은 테이블에서 모두 동시에 읽고 쓰기 작업을 할 때, 각각의 트랜잭션을 격리하면 동시 트랜잭션이 서로 방해하거나 영향을 미치지 않습니다. 각각의 요청이 실제로는 모두 동시에 발생하더라도, 마치 하나씩 발생하는 것처럼 발생할 수 있습니다.
- 영속성(Durability) - 트랜잭션 실행으로 인해 데이터에 적용된 변경 사항이 저장되도록 보장합니다. 시스템 오류가 발생해도 마찬가지입니다
9.MySQL과 Prisma를 MongoDB와 mongoose로 변경 시 코드 변경
• 많은 코드 변경 필요성: 데이터 모델링 방식과 ORM 라이브러리가 다르기 때문에 많은 코드 변경이 필요할 수 있습니다.
• 변경이 필요한 코드:
• 데이터 모델 정의
• 데이터베이스 쿼리
• 스키마 정의와 관련된 부분
10. DB 변경 시 코드 변경을 쉽게 하는 방법
1. Repository 패턴 사용: 데이터베이스 접근 로직을 분리하여 변경 시 해당 부분만 수정하도록 합니다.
2. 추상화 계층 도입: 데이터베이스에 접근하는 코드와 비즈니스 로직을 추상화 계층을 통해 분리합니다.
11. Class와 Instance
• Class: 객체를 생성하기 위한 템플릿. 속성과 메서드를 정의합니다.
• Instance: Class를 사용하여 생성된 실제 객체입니다.
Class는 객체를 만들기 위한 설계도이며, Instance는 그 설계도를 바탕으로 만들어진 실제 객체입니다. 레이어 아키텍처 패턴에서 클래스를 정의하고, 이 클래스를 사용하여 인스턴스를 생성한 후, 라우터에서 인스턴스를 사용하여 요청을 처리하는 방식으로 설명할 수 있습니다. 이는 클래스와 인스턴스의 개념을 명확히 하고, 실제로 어떻게 사용하는지 보여주는 좋은 예시입니다.
12. Class Method의 화살표 함수 문제와 해결
• bind 메서드를 사용하여 명시적으로 this를 설정합니다.
• 클래스 생성자에서 메서드를 this에 바인딩합니다.
13. 3-Layered Architecture의 각 Layer 역할
• Controller: 사용자 요청을 처리하고 응답을 반환합니다.
• Service: 비즈니스 로직을 처리합니다.
• Repository: 데이터베이스와 상호작용합니다.
14. 3-Layered Architecture의 장점과 단점
• 장점:
• 코드의 가독성과 유지보수성 향상
• 각 계층의 책임 분리로 인해 코드 관리 용이
• 단점:
• 초기 설계와 구현이 복잡
• 계층 간의 통신 오버헤드 발생
15. Service, Repository Layer에서 에러 전달 방법
Service와 Repository Layer에서 발생한 에러는 에러 객체를 생성하고 이를 throw하여 상위 계층에서 처리하도록 합니다.
16. 의존성 주입(DI, Dependency Injection)
의존성 주입은 객체 간의 의존 관계를 외부에서 주입하여 객체의 생성과 관리 책임을 분리하는 디자인 패턴입니다.
• 사용 이유:
• 모듈화와 테스트 용이성
• 코드 재사용성과 유지보수성 향상
17. 테스트 코드 작성의 장점과 단점
• 장점:
• 코드의 신뢰성 향상
• 리팩토링 시 안전성 보장
• 문서화 역할
• 단점:
• 초기 작성 시간과 비용
• 유지보수 비용
18. GIVEN-WHEN-THEN 패턴
• GIVEN: 테스트의 사전 조건 설정
• WHEN: 테스트 실행
• THEN: 기대 결과 검증
19. Mocking을 이용하는 이유
Mocking은 실제 객체를 대체하여 테스트 환경을 설정하는 것입니다. 이를 통해 다음을 달성할 수 있습니다:
• 외부 의존성 최소화
• 테스트의 독립성 보장
• 테스트 속도 향상
20. 테스트의 종류 3가지
1. 단위 테스트(Unit Test):
• 개별 함수나 모듈을 테스트합니다.
• 예시: 특정 함수의 출력 값을 검증하는 테스트.
2. 통합 테스트(Integration Test):
• 여러 모듈이 함께 동작하는 것을 테스트합니다.
• 예시: 데이터베이스와의 상호작용을 포함한 서비스 테스트.
3. 엔드 투 엔드 테스트(End-to-End Test):
• 애플리케이션의 전체 흐름을 테스트합니다.
• 예시: 사용자가 로그인부터 로그아웃까지의 시나리오를 테스트.