2022-06-22(Section2_회고)

이상수·2022년 6월 25일
0

TIL_회고

목록 보기
2/3
post-thumbnail

Section.2 을 마치며 후기 및 자기반성

  • 정말.. 벌써 이 코드스테이츠 부트캠프를 시작한지 2달이라는 시간이 흘렀다. 0ㅁ 0
    처음 시작을 할 때 거의 6개월이라는 시간동안 공부를 해야된다고 생각하니 어떻게보면 끔찍하기도하고.. 언제 이 시간이 전부 흘러 갈까 했는데 정말 정신없이 공부해야할 것들이 많고 이를 하다보니 금방 시간이 흘러가 버렸다.

  • Section1과 달리 기존에 배웠던 프로그래밍 언어를 기반으로한 문제풀이/개념이 아니라 실제 클라이언트의 요청을 처리하며 서버/데이터베이스를 건드리는 부분을 학습하고 있는데 정말 진짜로 이해가 너무너무 어렵다. 프로그래밍을 조금이라도 배워봤던 나도 이런데 정말 처음시작하는 분들은 어떻게 이부분을 할지 정말 대단한 분들인 것 같다.

  • 그래도 실제 Spring Framework를 이용하여 간단하게 IoC에 의한 DI를 실제로 실습해 보고 Spring을 이용하여 작성할 때 고려해야할 POJO와 같은 여러 개념을 학습하였다.

  • 앞으로 Section3 부터는 실제로 이 배웠던 것들을 기반으로 실제 서버와 Client로 통신을 해보고 할 것이라 하였는데, 이제야 정말 현업에서 실제 하는 코드들을 배운고 실습한다 생각하니까 두근두근 거리고 긴장되기도 한다.

  • 그리고...아직까지 내 하는것에 바빠서 코딩테스트를 많이 준비하지 못하였는데, 정말 반성해야할 부분이다. 꼭 시간이 부족하더라고 짧게나마 알고리즘 문제를 해결하며 기존 Java프로그래밍을 잊지말고 Spring 개념 부분도 복습 하여야 겠다.

간단하게 학습하였던 부분 정리

  1. 재귀 vs 반복문 을 통한 알고리즘 문제해결

  2. 알고리즘을 위한 자료구조 (Stack,Queue, Tree, Graph) 형태와 이들을 활용하여
    알고리즘 해결 기술(BST,Search, BFS,DFS )들에 대한 학습

  3. 알고리즘 해결시 고려해야할 사항 및 기술(Time Complexity, Greedy 알고리즘, Dynamic Programming[큰->작은 쪼개기], Brute-Force[완전탐색], 순열/조합, Extra. 정규표현식)

  4. 네트워크의 브라우저에 대한 여러 개념에 대한 학습

  • Server 아키텍처
  • URI,URL, IP/TCP, DNS, Error Code
  • HTTP 요청/응답 형태 기술
  • AJAX기술, CSR/SSR, CORS
  1. HTTP의 REST API설계와 설계기법
  2. 데이터베이스(DB)의 조작
  3. Spring Framework의 핵심개념/이해
  • POJO _ (IoC-DI/AOP/PSA)
  • Modul 구성
  • AOP/DI 기법 자세히

  • 배웠던 내용들의 정말 핵심적인 요소들만 간결하게 적었는데도 굉장히 많은 내용을 배웠구나.. 하는 생각이 든다.

  • 이전과 마찬가지로, 코드스테이츠에서 기술면접을 통해 각 원하는 내용들을 학습하고 이를 토대로 페어와 각 모의 기술면접을 하여 잘 이해가 안갔던 부분에 대한 내용을 추가적으로 학습하였다.

  • 이를 심화적으로 공부하게 되었고 같은 내용이라도 다른이들의 모의면접을 보면서 나는 사용하지 않았지만 그 분은 사용하였던 용어나 내용들을 추가로 들을 수 있어서 좋았다.



기술면접 정리


1. 인접 행렬과 인접 리스트의 차이점
 - 인접 행렬은 그래프의 연결관계를 이차원배열로 나타낸 형식인데, 그래프의 노드(점, 데이터 등)에서 다른 노드까지의 간선의 유무를 0(없음), 1(있음)으로 나타내는 형식이다. 이는 이차원 배열의 형태로 나타내 노드들간의 연결관계가 없어도 이 없다는것들 표현해주어 노드간의 연결을 확인하는데 a[i][j] 의 값만 확인하면 되어 시간복잡도가 O(1)을 가진다는 장점이 있지만 인접리스트에 비해 공간을 많이 차지하고 연결되어 있는 모든 노드들을 확인하기 위해서는 해당 노드의 배열의 값을 모두 확인해야 하여 O(v)의 시간이 걸린다는 단점이 있다. 주로, 가장 빠른 경로를 찾는데 사용

    인접 리스트는 그래프의 연결관계를 리스트를 이용해 나타낸 형식으로, 실제 연결되어 있는 노드들만 해당 노드의 리스트에 추가하여 비교적 인접행렬에 비해 간단하고 적은 메모리를 차지한다. 하지만, 인접행렬과 달리 특정 노드에서 다른 노드로 연결이 되어 있는지 확인하려면 해당 노드 리스트를 모두 거쳐가며 확인을 해봐야 하여 특정 연결관계를 찾는데 인접행렬보다 시간이 더 소요되어 O(e)의 시간이 걸린다.


2. REST API란 무엇인가?
 - REST는 자원을 이름으로 구분하여 해당 자원의 정보를 주고받는 것을 의미하는데, 이는 웹의 장점을 최대한 활용할 수 있는 아키텍처이다.
   REST API는 HTTP 프로토콜을 이용하여 클라이언트와 서버간의 통신을 하는 방식(ex. 레스토랑 주문지)을 나타내는데, 데이터와 자원들 uri(url + 식별자)로 표현한다.
   REST API는 0~ 3 단계로 나누어져 있는데, 2단계 까지만 거쳐도 좋은 API라 불리며 각 단계는 0). 단순 HTTP 프로토콜 사용, 1). 엔드포인트를 사용하여 개별 리소스와의 통신을 준수, 2). CRUD에 맞게 적절한 HTTP 메서드를 사용하는 것에 중점을 둔다. 3). 리소스의 응답에 URI를 포함한 링크 요소를 삽입하여 작성한다.

3. 트랜잭션에 대해 설명해주세요.
 - DB상태를 변화시키는 논리적 기능을 수행하는 하나 이상의 쿼리(수정,삽입등)를 모아 놓은 "하나의 작업 단위"로
    ACID성질을 가지고 있습니다.
   (1) Atomicity(원자성) : 하나의 트랜젝션의 모든 연산은 모두 성공or 모두 실패
   (2) Consistency(일관성) : 하나의 트랜젝션 전후의 DB는 일관적이여야 함 
   (3) Isolation(독립성) : 각각의 트랜젝션은 서로 독립적으로, 영향을 줄 수 없다
   (4) Durability(지속성) : 하나의 성고된 트랜젝션에 대한 로그가 영구적으로 남는다.


4. Spring에서 AOP가 필요한 이유에 대해 설명해주세요.
 - AOP는 관심 지향 프로그래밍인데, Spring은 POJO기반 객체지향 프로그래밍을 기반으로 설계를 하는데, 작성을 하다보면 핵심 로직이 아닌 공통 로직(로깅,보안,트랜잭션 등)이 객체들에 중복하여 들어가 코드의 중복을 야기한다. 
   이는 객체 지향적으로 설계하였지만 코드의 중복이 많아 코드의 간결성을 해치고 재활용성이 떨어진다. 
   따라서 공통 로직의 분리시키는 이 AOP(관심지향)를 이용하여 공통 로직들을 따로 분리하여 관리하며 필요한 적용시점에 적용시키며 1). 코드의 간결성, 2). 높은 재사용성 등을 얻을 수 있다.


5. 스프링 컨테이너에 대해 설명해주세요.
 - 스프링 컨테이너는 Ioc(제어의 역전, 코드의 흐름이 개발자가 아닌 어플리케이션 자체에 있음)을 기반으로한 Spring에서 사용하는 객체들을 관리해주는 기능 중 하나이다. 
   이는 XML or 에너테이션 기반의 자바 설정 클래스를 이용하여 만들 수 있는데, Spring Container에서 관리하는 개체들을 Bean이라 하고, 이 Bean들의 생명주기, 인스턴스화 등을 를 관리한다.
   또한, 의존성 주입을 통해서 서로 다른 빈들을 연결해 주는 역할을 하여 개발자가 이로 부터 자유로워 진다. (메서드의 호출시기와 필요한 매개변수등을 따로 정의해줄 필요가 없다.)

6. DI에 대한 설명과 기술의 장점에 대해 설명해주세요.
 - DI는 의존성 주입 이라 불리는데 이는 외부에서 객체를 주입받아 의존관계가 이루어 진다.
   또한, IoC(제어의역전)프로그래밍 모델을 구현하는 방식 중 하나라 볼 수 있고, 인터페이스를 활용하여 최대한 느슨한 의존성 주입을 추구하여야 한다.(Interface 를 이용)
   기술들에는 1). 생성자 주입, 2). 수정자 주입, 3). 필드 주입 4). 일반 메서드 주입 이 있는데, 주로 생성자 주입을 사용하여 의존성을 주입하는게 가장 현명하다. 이는, 의존 관계의 경우 불변의 법칙, 의존성 누락, final 키워드 사용 가능, 순환 참조 방지등의 장점이 있기 때문이다.
 



향후 계획 및 다짐

  • 이제 Section3를 시작하면서 Spring Framework를 실제적으로 조작하고 서버와 클라이언트간의 통신을 하게 되는데, 전혀 지식이 없는 부분이기도하고 굉장히 촉박하게 흘러가기에 많은 어려움이 있을 것이라 생각이 되어 오후 스터디를 하나이상은 꼭 하려고 한다.
  • 페어 프로그래밍을 할 때도 이전보다 적극적으로 활용하고 모르는 부분은 페어분이 된다면 저녁시간 이후에 추가적으로 학습을 진행하고 오늘 선참시에서 말씀해주셨던 페어 소규모 프로젝트같은것도 굉장히 좋은 것 같아서 문제풀이와 페어 소규모 프로젝트를 진행해 보려고 한다.
  • 기존에 목표로 하였던, GitHub에 1일 1커밋을 열심히 하고 있는 중이긴하는데, 아직 정리를 다 하지못하고 12시에 넘어가여 커밋을 하지 못하는 날도 생겼다. 그래도 꾸준히 이를 작성하고 있고 잔디가 심어져있는걸 보니 뿌듯하다.

  • 꾸준히 꼭 알고리즘 문제 해결을 해나가며 연습해야 겠다.



끝으로...

  • 코드스테이츠를 수강하면서 블로깅,TIL,회고등 평소 전혀 해보지 않았던 활동들을 굉장히 많이 하게 되었는데 지금도 스스로 많은 도움이 된다 생각하는데 이가 쌓여서 향후 어떠한 방향으로 내게 도움이 될지 궁금하다 .. !!
  • 아직 끝을 향하려면 먼 길이지만 꾸준히 몸관리도 하며 결코 빠르지는 못해도 꾸준히 학습해가며 훌륭한 프로그래머가 되고자 한다 !!

  • 앞으로 점점 더 어려워질 것 같은데, 어렵더라도 포기하지 않고 끝까지 수료하며, 부족한 부분은 주말에 복습하여야 겠다.

홧팅!

profile
Will be great Backend-developer

0개의 댓글