오늘 공부한 내용

  • 면접대비 2문항 공부
  • 마지막 프로젝트 / 중간 발표!!

 

새로 알게된점

프로세스 쓰레드

프로세스 : 운영체제에 의해 관리되는 독립적인 작업 단위

- 각 프로세스는 독립된 메모리 공간을 할당받고, 자체적인 자원을 가지며, 다른 프로세스와는 독립적으로 실행되며 동시에 여러개의 프로세스를 실행할 수 있습니다.

 

쓰레드 : 프로세스 내에서 실행되는 작은 작업 단위

- 하나의 프로세스는 여러 개의 쓰레드를 가질 수 있으며, 각각의 쓰레드는 프로세스의 주소 공간을 공유하고, 동시에 실행가능하며 쓰레드는 프로세스 내에서 병렬적으로 작업을 수행하여 프로세스의 성능을 향상 시킬 수 있습니다.

 

프로세스와 쓰레드 의 차이점

  1. 자원 소비: 프로세스는 독립된 메모리 공간과 자원을 할당받으므로, 프로세스 간의 자원 공유가 어렵고, 자원 소비가 크다. 반면에 쓰레드는 하나의 프로세스 내에서 자원을 공유하여 사용하기 때문에 자원 소비가 상대적으로 적습니다.
  2. 독립성: 프로세스는 독립된 실행 단위로, 각각의 프로세스는 독립적으로 실행된다. 하지만 쓰레드는 하나의 프로세스 내에서 실행되기 때문에, 쓰레드 간의 통신과 동기화가 필요합니다. 
  3. 생성과 소멸: 프로세스는 운영체제로부터 자원을 할당받아 별도로 생성되지만 쓰레드는 프로세스 내에서 생성되며, 쓰레드의 생성과 소멸은 비교적 빠르고 경제적입니다.

 

프로세스와 쓰레드로 구분지어서 사용하는 이유

- 운영체제에서 시스템 자원을 효율적으로 관리하기 위해서 스레드를 사용하는것 !

  • 멀티 프로세스로 실행되는 작업을 멀티 스레드로 실행 할 경우, 프로세스를 생성하여 자원할당하는 시스템 콜이 줄어들어 자원을 효울적응로 관리
  • 프로세사 간의 통신보다 스레드 간의 통신의 비용이 적으므로 작업들 간의 통신의 부담이 줄어듬

 

새로 느낀점

오늘 팀프로젝트간의 중간 발표가 있는 날이었다.

어제부터 못다한 페이지 프론트 css 작성과 코드 리펙토링으로 밤을 세우고 발표 PPT까지 만들어 제출후 팀장 동하님이 발표를 맡게되었다.

순서는 역순으로 하여 9조였던 우리조가 오히려 초반에 발표하니 맘이 좀 편했던것도 없지않아 있었다.

이후 다른 팀의 발표들을 시청하면서 우리가 생각하지 못했던 개발 방법이나 주제로 어떤방식으로 해왔는지 다양하게 알수 있어서 좋은 시간 이었다.

앞으로 마지막까지 최선을 다하여 좋은 결과를 얻고 싶다

오늘 공부한 내용

  • 면접대비 2문항 공부
  • 마지막 프로젝트 / 프론트 작성을 위해서 CSS 웹개발강의 재시청

 

새로 알게된점

OAuth

- 인터넷 사용자가 웹 사이트 또는 애플리케이션에 로그인할 때 다른 웹 사이트 또는 애플리케이션의 자원에 대한 접근 권한을 부여하는 프로토콜, 즉 외부 서비스에서도 인증을 가능하게 하고 그 서비스의 API를 이용하게 해주는 것

 

OAuth 의 사용배경

- 기존의 회원가입, 로그인시 아이디와 비밀번호를 제공하지 않고 싶은 욕구와 이를 통하지 않고 가입, 로그인을 하기위하여 인증과 권한을 부여하기 위한 인증방식을 찾기위해서 탄생하게 됨.

 

OAuth 작동 구조

  1. 리소스 소유자(이하 유저)가 클라이언트 서비스를 이용하고자 이용 요청을 보냄.
  2. 클라이언트는 검증 서버에 액세스 토큰을 요청.
  3. 검증 서버는 유저에게 인가 동의를 요청.
  4. 유저는 인가 동의를 응답.
  5. 검증 서버는 리소스에 접근할 수 있는 액세스 토큰을 생성해 클라이언트로 전송.
  6. 클라이언트는 액세스 토큰을 저장.
  7. 클라이언트는 액세스 토큰을 가지고 리소스 서버에 요청을 보냄.
  8. 리소스 서버는 액세스 토큰의 유효성을 파악하고 나서, 요청한 리소스를 클라이언트에 응답.
  9. 클라이언트는 유저에 서비스 이용을 응답.

여기서 중요한것이 하나 있는데 그것은 바로 액세스 토큰!

 

OAuth에서 액세스 토큰 이란?

  • 사용자가 인증된 후에 리소스에 접근할 수 있는 권한을 부여하는 보안 토큰을 말함.
  • 제한된 기간 동안 유효하며, 인증된 사용자가 자원에 접근할 때마다 이 토큰을 제출하여 인증 및 권한 부여를 받음.
  • 액세스 토큰은 애플리케이션과 인증 서버 간에 안전하게 교환되며, OAuth 프로토콜을 통해 보안을 유지하고 인가된 접근을 관리하는 데 사용됨

 

 

 

오늘 공부한 내용

  • 코드카타 2문제
  • 면접대비 2문항 공부

 

어려웠던 내용

  • 어제 하던 CI/CD 구현을 위하여 gradle.yml 설정을 작성하는게 너무 어렵다. 구글링 하면서 어느정도 기본은 작성했지만 옳은지는 잘모르겠다 이번주까지 꼭 완료를 목표로 잡고 처리해야겠다.

 

새로 알게된점

  • 대용량 트래픽 발생 시 에 대한 대처 방법

로드 밸런싱: 로드 밸런싱은 트래픽을 여러 대의 서버로 분산시켜 처리하는 방법입니다. 이를 통해 각 서버의 부하를 분산시켜 전체 시스템의 성능을 향상시킬 수 있습니다. 로드 밸런서를 사용하여 트래픽을 효율적으로 분산시킬 수 있습니다.

 

캐싱: 캐싱은 반복적으로 요청되는 데이터나 연산 결과를 저장하여 다음 요청 시에는 데이터베이스나 서버에 접근하지 않고 캐시에서 바로 응답하는 것을 의미합니다. 캐싱을 통해 서버 부하를 줄일 수 있으며, 대량의 트래픽에 대한 응답 속도를 향상시킬 수 있습니다.

 

자동화된 스케일 업 및 스케일 아웃: 대용량 트래픽이 발생하면 서버 용량을 자동으로 확장시키는 스케일 업(Vertical Scaling) 또는 서버 자체를 추가하여 시스템을 확장시키는 스케일 아웃(Horizontal Scaling)과 같은 자동화된 방법을 고려할 수 있습니다. 이를 통해 트래픽에 따라 시스템을 유연하게 조정할 수 있습니다.

 

성능 모니터링: 대용량 트래픽 상황에서는 실시간으로 시스템의 성능을 모니터링하는 것이 중요합니다. 성능 모니터링 도구를 사용하여 서버 부하, 응답 시간, 자원 사용률 등을 지속적으로 모니터링하고, 이를 기반으로 대응 전략을 수립할 수 있습니다.

 

오늘 공부한 내용

  • 코드카타 2문제
  • 면접대비 2문항 공부
  • 마지막 프로젝트 / CI/CD 구현을 위한 도커 수정

 

새로 알게된점

도커 

- 리눅스 컨테이너에 리눅스 어플리케이션을 프로세스 격리 기술을 사용하여 더쉽게 컨테이너로 실행하고 관리할 수 있게 해주는 오픈소스 프로젝트

 

도커의 구성요소로는 크네 도커파일, 도커이미지, 도커컨테이너 로 이루어져 있는데 

위 순서 대로 도커 컨테이너가 생성이 된다.

Dockerfile을 작성하고 빌드하여 도커 이미지를 생성한 후, docker run 명령을 통해 컨테이너를 실행할 수 있습니다. 이를 통해 도커 컨테이너를 생성하고 실행하여 개발 및 운영 환경을 구축할 수 있다.

 

  • 도커파일 : 컨테이너 내부에 설치할 소프트웨어, 설정값, 실행 명령 등을 명시하는 스크립트 형태의 파일

도커파일은 다음과 같은 구조로 작성 된다.

FROM base_image     	// 베이스 이미지 선택
WORKDIR / app			// 작업 디렉토리 설정
COPY source destination	// 파일복사
RUN command				// 명령실행
ENY var iable value		// 환경변수 설정
EXPOSE port				// 포트개방
CMD [""executable]		// 실행할 명령 지정 

 

 

  • 도커 이미지 : 컨테이너를 생성할 때 필요항 요소, 가상 머신을 생성할때 사용하는 iso파일과 비슷한 개념
    • 저장소 이름 : 이미지가 저장된 장소
    • 이미지 이름 : 해당 이미지가 어떤 역할을 하는지 나타내며 필수로 설정해야함. ex) ubuntu:lastest -> 우분투 컨테이너를 생성하기 위한 이미지라는걸 나타냄
    • 태그 : 이미지의 버젼을 나타냄. 태그를 생략하면 도커엔진은 latest로 인식함.
  • 도커 컨테이너 : 가상화된 공간을 생성하기 위해 리눅스 자체 기능인 chroot, 네임스페이스, cgroip을 사용하여 프로세스 단위의 격리 환경을 만들어낸 공간

 

  • 도커를 사용하는 이유
    1. 성능손실이 거의 없다. / 가상공간 생성시 리눅스 자체기능을 사용하여 프로세스 단위의 격리 환경 생성
    2. 용량이 작다. / 가상 머신과 달리 커널을 공유, 컨테이너에는 라이브러리 및 실행파일 만 존재
    3. 배포하는 시간이 가상머신에 비해 빠름, 사용할때 성능손실 거의없음 / 컨테이너를 이미지로 만들었을때

 

어려웠던 내용

  • 도커 내에 들어갈 설정을 잘 구분하지 못해서 작성에 어려움을 느꼇다.

 

 

오늘의 느낀점

오늘 드디어 도커 컨테이너 까지 작성후 어제 작성했던 github actions에 적용하여 배포에 성공하였다.

저번주 부터 주말동안 계속 작성하고 오류나면서 막현던 부분을 박성원 튜더님에게 끈질기게 달라붙어서 해낸 끝에 얻어낸 결과라서 너무 기분 좋았다

주요 작성과 운용은 은채님이 하셨지만 옆에서 최대한 같이 구글링하면서 같이 며칠을 밤새며 간신히 해낸것이다보니 더욱 뿌듯하다.

여태까지 배운것을 바탕으로 남한테도 잘 알려줄수 있게 따로 정리해보아야 겠다.

 

오늘 공부한 내용

  • 코드카타 2문제
  • 면접대비 2문항 공부
  • CI/CD 구현을 위해서 스파르타 강의 시청

 

어려웠던 내용

  • CI/CD 구현을 위하여 gradle.yml 설정을 작성하는게 너무 어렵다. 자세한 내용이 강의에 안나와 있어서 열심히 구글링 하면서 찾고 주변 다른 팀에게도 물어다녀봤지만 적을때마다 생겨나는 오류와 문제점들로 해결이 안돼서 계속 찾고있다.

 

새로 알게된점

  • DI, IoC에 대하여

DI(Dependency Injection, 의존성 주입): DIIoC의 한 형태로, 클래스가 자신이 의존하는 객체를 직접 만들지 않고 외부에서 주입받는 패턴입니다. 예를 들어, 클래스 A가 클래스 B의 메서드를 사용해야 할 때, AB를 직접 생성하지 않고 외부에서 B의 인스턴스를 주입받아 사용합니다. 이 방식을 통해 클래스 간의 결합도를 낮추어 코드의 재사용성을 높이고, 테스트하기 편하게 만듭니다.

IoC(Inversion of Control, 제어의 역전): 전통적인 프로그래밍에서는 객체가 자신의 행동을 제어합니다. 그러나 IoC 패턴에서는 이러한 제어 흐름이 외부 컨트롤러에 의해 결정됩니다. , 객체가 프로그램의 흐름을 제어하는 대신 외부에서 그 흐름을 관리하고 제어하는 것입니다. 이로 인해 코드 간의 결합도를 낮추고, 유연성과 확장성을 높일 수 있습니다.

 

 

  • 객체지향 프로그래밍이란 무엇이고 어떻게 활용할 수 있나요?

정의 : 프로그램을 객체들의 집합으로 보고 이들이 서로 상호작용하도록 설계하는 방법론

 

ORM 이란 :  객체와 관계형 데이터베이스 간의 매핑을 자동화하는 기술을 말하며 이를 사용하면 개발자는 SQL 쿼리를 직접 작성하지 않고도 객체 지향적인 방식으로 데이터베이스와 상호 작용할 수 있다.

 

객체지향 프로그래밍의 핵심 원칙에는 캡슐화, 상속, 다형성이 있다.

1. 캡슐화는 객체의 상태와 행동을 하나로 묶어 외부의 접근을 제한한다.

2. 상속은 코드의 재사용성을 높이고 중복을 줄이는데 도움을 준다.

3. 다형성은 하나의 인터페이스나 클래스가 다양한 형태로 동작할 수 있게 하여 유연성과 확장성을 높인다.

 

이런 원칙들을 활용하면, 코드의 재사용성을 높이고, 유지보수와 테스트를 용이하게 하며, 실제 세계의 문제를 더욱 효과적으로 모델링할 수 있습니다. 예를 들어, 웹사이트에서 '사용자'라는 클래스를 만들어 각 사용자의 정보와 행동을 모델링하고, 이를 통해 각 사용자가 독립적으로 행동하도록 만드는 것입니다."

 

절차지향 프로그래밍과 차이점

객체지향 프로그래밍은 상속, 다형성 등의 원칙 덕분에 코드의 재사용성이 높고, 새로운 기능을 추가하거나 변경하기 쉽습니다.

하지만 절자지향 프로그래밍은 데이터와 함수를 사용하다보니 명확한 문제에 대해 직관적으로 접근하는 데 유리하지만 코드의 재사용이 상대적으로 어렵고, 기능의 변경이나 확장이 기존 코드에 영향을 미칠 수 있어서 간단한 문제나 알고리즘 구현에 많이 쓰입니다.

 

오늘의 느낀점

오늘 팀원들과 토의중 빠른배포를 위하여 CI/CD를 하기위하여 은채님과 같이 하게 되었다.

내용에 대해서 잘 알지 못해서 강의 시청 하면서 CI/CD가 무엇인지 와 왜 사용되는지에 대해서 공부하다 보니

좀더 업무를 효율적으로 사용함과 동시에 사용자들의 편의성을 중점으로 한 프로그램이라는것을 알게 됬다.

gradle.yml을 작성하여 설정을 하라고 하는데 gpt 와 구글링으로 찾다보니 현재 하고 있는 프로젝트를 CI/CD로 적용하기위해서 작성하는 내용이 맞는것인지 잘 구분이 안가면서 하다보니 시간은 참 빠르게 가지만 성과는 잘 나지 않는다.

개발자가 되면 검색하는 것과 이를 적용하는 것도 중요한 능력이라고 하는데 아직 많이 미숙한지 너무 어렵게 느껴진다.

 

오늘 공부한 내용

  • 코드카타 2문제
  • 면접대비 2문항 공부
  • 마지막 프로젝트 제작 / 탈퇴 기능 수정 및 코드 정리

 

새로 알게된점

  • TCP/UDP에 대해서 설명

TCP : 인터넷상에서 데이터를 메세지의 형태로 보내기 위해 IP와 함께 사용하는 프로토콜

  1. 연결형 서비스 패킷 교환 방식을 사용한다.
  2. 3-way handshaking과정을 통해 연결을 설정하고 4-way handshaking을 통해 해제한다.
  3. 흐름 제어 및 혼잡 제어(데이터 처리속도를 조절, 수신자의 버퍼 오버플로우 방지)
  4. 높은 신뢰성을 보장한다.
  5. UDP보다 속도가 느리다.

UDP : 데이터를 데이터그램 단위로 처리하는 프로토콜

  1. 비연결형 서비스로 데이터그램 방식을 제공한다
  2. 정보를 주고 받을 때 정보를 보내거나 받는다는 신호절차를 거치지 않는다.
  3. UDP헤더의 CheckSum 필드를 통해 최소한의 오류만 검출한다.
  4. 신뢰성이 낮다
  5. TCP보다 속도가 빠르다

TCP와 UDP의 신뢰성 차이는 TCP의 연결 설정과 종료, 에러 검출 및 재전송 등의 과정이 있으며, 반면에 UDP는 이러한 과정이 없기 때문에 발생한다.

 

* 3-way handshaking은 TCP에서 신뢰성 있는 통신을 위해 연결을 설정하는 과정

1. 클라이언트가 서버에게 연결 요청과 함께 SYN 패킷을 보냄

2. 서버는 이를 받고, SYN-ACK 패킷을 서버 시퀸스번호와 함께 클라이언트에게 보냄

3. 클라이언트는 서버의 SYN-ACK 패킷을 받고 이를 확인하는 ACK 패킷을 보냄

 

 

  • http, https 차이점

HTTP : 클라이언트와 서버 간 통신을 위한 통신 규칙

HTTPS : HTTP확장판, 브라우저와 서버가 데이터를 전송하기 전에 안전하고 암호화된 연결을 설정

 

차이점

보안 : 가장 큰 차이점은 보안입니다. HTTP는 암호화되지 않은 텍스트로 데이터를 전송하는데 반해, HTTPSSSL 또는 TLS를 이용하여 모든 통신을 암호화합니다. 이로 인해 중간에서 데이터를 가로채더라도 그 내용을 이해하는 것이 어렵습니다.

포트 : HTTPHTTPS는 서버와 클라이언트 간의 통신을 위해 다른 포트를 사용합니다. HTTP80번 포트를, HTTPS443번 포트를 사용합니다.

URL 표시 : 대부분의 웹 브라우저에서 HTTPS 사이트의 URL 앞에 '보안'을 의미하는 자물쇠 아이콘이 표시됩니다. 이는 사용자에게 이 사이트가 안전하다는 신호를 보내주는 역할을 합니다.

인증 : HTTPS는 인증서를 사용해 서버의 신원을 검증합니다. 이 인증서는 신뢰할 수 있는 제3자 기관(Certificate Authority, CA)에 의해 발급되며, 사용자는 이를 통해 자신이 연결하려는 사이트가 실제로 해당 사이트임을 확인할 수 있습니다.

 

 

오늘 공부한 내용

  • 코드카타 2문제
  • 면접대비 2문항 공부
  • 마지막 프로젝트 제작 (하이브유저 가입, 전체검색, 단일검색, 탈퇴  구현 완료)

 

어려웠던 내용

  • 코드 작성시 큰 문제없이 잘 작성이 잘된거 같아서 실행에 문제는 없었는데 Postman 으로 적용시 쿼리문이 나가지만 실질적인 데이터베이스에는 적용이 안되어서 찾아보니 @Transactional이 안적혀 있거나 혹은 Postman에서 / 하나가 더적혀 있는 등 미세한 문제점을 찾아내는데 시간을 많이 사용하게 되어서 어려웠다.

 

새로 알게된점

  • 브라우저의 작동방식에 대해서 설명해주세요.

정의 : URL을 입력하면 웹 서버라 불리는 프로그램이 웹 브라우저에 웹 페이지를 제공

 

작동방식

  1. 사용자가 URL을 입력하면 브라우저는 웹 서버에 HTTP 요청을 보내고 데이터를 수신한다.
  2. 받은 HTMLCSS는 파싱되어 DOMCSSOM 트리를 생성하며, 이들은 렌더 트리로 병합된다.
  3. 렌더 트리를 기반으로 레이아웃 단계에서 각 요소의 크기와 위치를 계산한다.
  4. 계산된 정보로 화면에 페이지를 그리는 페인팅 단계가 이루어진다.
  5. 필요한 JavaScript가 실행되고 모든 요소가 로드되면 페이지가 완성되어 사용자와 상호 작용한다.

 

 

  • 쿠키, 세션의 개념과 차이를 설명해보세요

쿠키 : HTTP의 일종으로 사용자가 웹 사이트를 방문할 경우 사용되는 사용자의 컴퓨터에 저장하는 작은 기록 정보 파일

세션 : 방문자가 웹 서버에 접속한 시점부터 웹 브라우저를 종료하여 연결을 끝내는 시점, 즉 서버에 접속해 있는 상태

 

차이점

  1. 사용자의 정보가 저장되는 위치이며, 쿠키는 서버의 자원을 전혀 사용하지 않지만 세션은 서버의 자원을 사용
  2. 쿠키는 만료기간이 파일로 저장되어 브라우저를 종료해도 정보가 유지되지만, 세션은 브라우저가 종료되면 만료시간에 상관없이 삭제됨으로 라이프 사이클에 큰 차이점을 가지고 있다.
  3. 이러한 특성으로 보안 측면에서 세션이 더 우수하나 요청속도는 쿠키가 더 빠르다.

쿠키 사용이유세션은 서버의 자원을 사용하기 때문에 무분별하게 만들다보면 서버의 메모리가 감당할 수 없어질 수가 있고 속도가 느려질 수 있기 때문에 쿠키가 유리한 경우가 있다

 

오늘의 느낀점

코드 작성시 중간 테이블에서 값을 찾기위하여 repository에서 메서드를 설정하는게 어려워서 작성에 많은 어려움을 가지다 보니 팀원의 도움으로 추천 메서드가 아닌 @Quary 어노테이션을 통해서 jpa에 있는 데이터를 직접적으로 적용하는 방식을 사용했다.

처음 사용할 시에는 오히려 낮설었지만 오히려 기존 repository에서 추천으로 작성하는것보다 좀더 상세하게 자료를 가져올수 있다보니 편리함을 느꼈다.

좀더 연습해서 익숙해지면 앞으로 매개변수의 값을 찾는데는 문제없이 코드 작성이 가능 할것이라고 생각된다.

오늘 공부한 내용

  • 코드카타 2문제
  • 면접대비 2문항 공부
  • 마지막 프로젝트 제작 (하이브 전체조회, 단일조회, 삭제 기능 구현 완료)

 

어려웠던 내용

  • 코드 작성시 큰 문제없이 잘 작성이 잘된거 같아서 실행에 문제는 없었는데 Postman 으로 적용시 쿼리문이 나가지만 실질적인 데이터베이스에는 적용이 안되어서 찾아보니 @Transactional이 안적혀 있거나 혹은 Postman에서 / 하나가 더적혀 있는 등 미세한 문제점을 찾아내는데 시간을 많이 사용하게 되어서 어려웠다.

 

새로 알게된점

  • HTTP 메서드

주요 메서드

GET : 리소스 조회 (서버에 전달하고 싶은 데이터는 query을 통해서 전달)

POST : 등록, 요청 데이터 처리 (데이터 전송시 Body에 담아 전송하므로 메시지 길이 제한이 없음)

PUT : 리소스 덮어쓰기(전체 변경, 기존데이터 A,BC를 보낼시 A,B삭제후 C로 대체됨.)

PATCH : 리소스 부분 변경(일부 변경, 기존데이터 A,BB=C로 대체시 A,C로 대체됨)

DELETE : 리소스 삭제

 

기타 메서드

HEAD : GET과 동일하나 메시지 부분(Body)를 제외하고, 상태 줄과 헤더만 반환

OPTIONS : 대상 리소스에 대한 통신 가능 옵션(메서드)을 설명

CONNECT : 대상 자원으로 식별되는 서버에 대한 터널을 설정

TRACE : 대상 리소스에 대한 경로를 따라 메시지 루프백 테스트를 수행

 

  • CORS(교차 출처 리소스 공유)

CORS(교차 출처 리소스 공유)

- 추가 HTTP헤더를 사용하여, 한 출처에서 실행 중인 웹 애플리케이션이 다른 출처의 선택한 자원에 접근할 수 있는 권한을부여하도록 브라우저에 알려주는 체제

 

CORS 필요 이유

- CORS가 없이 모든 곳에서 데이터를 요청할 수 있게 된다면, 다른 사이트에서 원래 사이트를 흉내낼 수 있게 된다. 이를 통해 로그인했던 세션 또는 토큰을 탈취하여 정보를 꺼내는 등 해킹이 가능해지므로 브라우저를 보호하고 필요한 경우에만 서버를 요청하기위하여 필요하다.

 

SOP(동일 출처 정책)

같은 출처에서만 리소스를 공유할 수 있다는 규칙을 가진 정책

다른 출처로부터 조회된 자원들의 읽기 접근을 막아 다른 출처 공격을 예방

 

오늘의 느낀점

코드 작성시 어렵게 느껴지는 부분은 작성후 확인했을때 오류를 찾아내는 점이 제일어렵게 느껴진다.

다만 코드 자체에서 문제일시 오류부분을 보면 찾는데 큰 어려움없이 문제 부분을 찾아서 해결책을 구상하지만 코드상 문제가 없다고 생각했는데 내가 원하는 값이 나오지 않아서 이에 문제점을 찾는 과정이 제일어렵다.

대부분 이럴경우 내가 철자를 잘못 입력하거나 미세한 실수로 일어나다 보니 더욱 찾기 어렵게 느껴지는거 같다.

작성시 코드 글자를 하나씩 차분히 뜯어보는 습관을 좀더 들여야 할거 같다.

오늘 공부한 내용

  • 코드카타 2문제
  • 면접대비 2문항 공부
  • 마지막 프로젝트 제작 (하이브 생성, 수정 기능 구현 완료)

 

어려웠던 내용

  • 하이브 생성 기능 구현시 매개변수 작성에서 혼란을 겪었으나 팀원의 도움을 받아 작성후 기능 구현에 완료 하였습니다.

 

새로 알게된점

  • RDBMS의 정규화

정규화 정의 : 관계형 데이터베이스(RDBMS)의 설계에서 데이터를 중복 없이 효율적으로 저장하기 위한 과정,

이를 통해 데이터 베이스의 불필요한 중복을 최소화하고 데이터 일관성과 무결성을 유지 가능함.

 

 1 정규형

- 테이블의 컬럼이 원자값(Atomic Value, 하나의 값)을 갖도록 테이블을 분해하는 것

 

 2 정규형

- 정규화를 진행한 테이블에 대해 완전 함수 종속 만족하도록 테이블을 분해하는 

- 완전함수종속 : 기본키가 구성하는 모든 속성에 종속되는 경우

- 테이블에서 기본키가 복합키(키1, 키2)로 묶여있을 때, 두 키 중 하나의 키만으로 다른 컬럼을 결정지을 수 있으면 안된다.

 

 3 정규형

- 정규화를 진행한 테이블에 대해 이행적 종속 없애도록 테이블을 분해하는 

- 이행적 종속 : A → B, B → C면 A → C가 성립된다

 

BCNF 정규형

3 정규화를 진행한 테이블'에 대해 모든 결정자가 후보키가 되도록 테이블을 분해하는 것

각 행(튜플, 가로줄)을 유일하게 식별하기 위해 사용하는 부분집합

 

  • Primary key, Foreign key 란

 : 관계(테이블)에서 행(튜플)을 식별하는 데 도움이 되는 속성

기본키 : 테이블의 모든 행을 고유하게 식별하는 열 또는 열 그룹

- null을 허용하지 않음, 유니크한 값

- 사용이유 : 기록 삭제, 수정 시 데이터 무결성을 확인하기 위함.

외래키 : 다른 테이블과의 관계를 맺기 위해 사용

- 여러개의 null값을 허용,

- 사용이유 : 두 개 이상의 테이블을 함께 연결, 데이터의 무결성과 일관성을 보장

 

객체 관계

1:1 = 한 테이블의 레코드가 다른 테이블의 레코드와 1:1로 대응, 한 명의 사용자가 한 개의 주소를 가지는 경우

단방향 : 외래 키 주인만이 외래 키 를 등록, 수정, 삭제할 수 있으며주인이 아닌 쪽은 오직 외래 키를 읽기만 가능

양방향 : 외래 키의 주인을 지정해 줄 때 mappedBy 옵션을 사용

 

1:N = 한 테이블의 레코드가 다른 테이블의 레코드와 1:N으로 대응, 한 명의 사용자가 여러 개의 주문을 가지는 경우

- N쪽에 외래키 성성, 1쪽이 연관 관계의 주인이 됨.

- 실무에서는 잘 사용하지 않으며 그 이유는 RDB 관점에서는 다수(Many)의 임장이 FK를 가져야 올바른 설계 이므로

 

N:1 = 1:N 관계의 반대에 해당 하는 경우, 여러 명의 선수가 한팀에 소속되는 경우

- N쪽에 외래키 생성, 연관 관계의 주인이 됨

 

N:M = 한 테이블의 레코드가 다른 테이블의 레코드와 N:M으로 대응, 여러 명의 학생이 여러 개의 과목을 수강하는 경우

관계형 데이터베이스는 정규화된 테이블 2개로 표현불가, 따로 테이블 생성

 

단점 

- 중간 테이블에는 매핑정보만 들어가고 추가 데이터를 넣는 것이 불가능,

- 중간 테이블이 숨겨져 있어 쿼리가 예상못한 형태로 출현

 

 

오늘의 느낀점

기술 면접을 하루하루 준비하고 공부하면서 내가 배웠던 지식에대해 다시 한번 재정립하고 더 많은 내용을 배울수 있게 되었다.

또한 스파르타 에 온이후 내가 스스로 처음으로 프로젝트에서 CRUD에서 생성과 수정을 큰 문제 없이 작성 할 수 있었다.

이전에 있던 팀에서 의 작성방법을 많이 타긴 했지만 앞으로 다양한 프로젝트를 겪으면서 더 많은 방식을 익히면 어떤 상황이라도 바로바로 적용할수 있는 능력을 기르게 될것이라고 생각한다.

 

오늘 공부한 내용

  • 코드카타 2문제
  • 면접대비 2문항 공부
  • 마지막 프로젝트 주제 구현 및 SA추가 작성

 

어려웠던 내용

  • 하이브 생성 기능 구현시 매개변수 작성에서 혼란을 겪었으나 팀원의 도움을 받아 작성후 기능 구현에 완료 하였습니다.

 

새로 알게된점

  • NoSQLRDBMS의 특징과 차이점에 대한 장, 단점

RDBMS : `관계형 데이터베이스` `Schema` `Table` `SQL`

정의 : 관계형 데이터베이스를 생성하고 수정, 삭제 관리할 수 있는 소프트웨어

특징 : 데이터 구조가 변경될 여지 없이 명확, Update가 잦은 시스템, 외래키를 이용한 테이블 간 Join 가능

장점 : DataColumn, Row형태로 저장, 분류, 정렬, 탐색속도 빠름, 스키마로 명확한 데이터구조 보장

단점 : 시스템이 커지면 Join문이 많은 복잡한 쿼리 생성, 수직적 확장을 주로 사용

 

NoSQL : `대용량데이터` `비규격화` `Key,Value`

정의 :

특징 : 데이터양이 많으며 Update가 자주 이루어지지 않을 때 사용, Key.Value 사용시 이미지, 비디오 등 어떠한 형태의 데이터도 담을 수 있다.

장점 : 유연한 데이터 구조, 수평적 확장 용이

단점 : 데이터 중복 발생 가능, 데이터 변경시 모든 컬렉션 수정필요,

 

  • mvc 패턴

- 답변 `model` `view` `controller`

정의 : 프로젝트 구성할 때 그 구성 요소를 세가지 역할로 구분한 패턴

장점 : 비교적 간단한 패턴으로 구조파악과 확장을 쉽게 할 수 있다.

단점 : 뷰와 모델의 완벽한 분리가 어렵고 앱이 커지면 컨트롤러의 코드량이 커져 유지보수 하기가 힘들다.

 

model (모델)

- 컨트롤러가 호출을 하면 DB와 연동하여 사용자의 입출력 데이터를 다루는 일과 같은 데이터와 연관된 비즈니스 로직을 처리하는 역할

- 데이터 추출, 저장, 삭제, 업데이트 등의 역할을 수행

 

view ()

- 사용자와 상호작용을 하며 컨트롤러로부터 받은 모델의 결과값을 사용자에게 화면으로 출력

 

controller (컨트롤러)

- ModelView 사이를 이어주는 인터페이스 역할

- Model이 데이터를 어떻게 처리할지 알려주는 역할

 

 

+ Recent posts