Section3_회고록

이상수·2022년 7월 20일
0

TIL_회고

목록 보기
3/3
post-thumbnail

Section3 후기

  • 코드스테이츠에서 부트캠프를 시작한지 이제 절반의 시간이 지나갔다. 뭐가 나 자신은 크게 달라진 것 같지 않은데 벌써 이만큼의 시간이 흘렀고 이제 한 섹션만 더 지나면 프로젝트를 해야된다니 앞길이 막막하다.

  • 그래도 처음과 달리 나 자신은 많은 부분이 성장한 것 같은데, 전체적으로 혼자서 딱 하나 만들어보세여! 하면 힘들지만, 이 부분의 코드들이 어떤 역할을하고 어떠한 형식으로 이 프로젝트들이 구현되어있는지 정도는 알아볼 수 있을정도는 되는 것 같다. (ㅇㅁ ㅇ .. 나란남자)

  • 이번 Section3에서는 Spring MVC(Model, View, Controller)로, REST API를 통해 웹의 기존기술과 HTTP 프로토콜을 이용하여 API/Service/DB 계층을 거치며 '클라이언트-서버'에서 데이터를 주고받고 이를 DB에 저장하고 받아오는 부분을 연습하였다.
    여기에 추가적으로, 유효한 Resource를 받기위한 적절한 유효성 검증과 DB의 일관성을 유지하기 위한 트랜잭션, 최종적으로 배포하는 방법을 학습하였다.

  • 기존에는 사용하기만 하였던 웹 기술들을 실제로 코드로 작성하여 돌아가는 방식을 이해하고 이를 작성하니 굉장히 뿌듯하엿다.
    다른 부분도 중요하지만, 이 부분과 Spring boot 기술들과 자료구조/알고리즘 부분은 정말 꾸준히 공부하여 최대한 흡수를 하여야 겠다.

1. Keeping / Problem

1. Keeping

  • GitHub에 1일 1커밋
  • Coding Test / Algorithm 대비 Study 시작
  • 주말에도 놓지않고 공부 꾸준히 하기
  • velog에 사용할 내용 정리(정리까지만 ㅠㅠ)
  • Coding Test를 위한 알고리즘 문제 꾸준히 해결

2. Problem

  • velog에 정리할 내용은 정리하였지만, 아직 작성자체는 못하고 있음
  • 기존보다 할게 많아지면서 저녁마다 꾸준히 운동을 하지 못하고있음(건강관리 측면)
  • 이전 부분에 대한 복습이 미흡



# Total

  • 목표로 세웠던 부분은 최대한 하려고하여 꾸준히 알고리즘 문제 해결과 이를 위해 스터디도 하고있다.
  • 학습을 하면서 velog에 활용하기 위해 정리한 내용들은 있지만, 하루 공부해야할 양이 굉장히 늘면서 velog에 꾸준히 작성을 하기가 힘들어졌다.
    이는, 매일은 아니여도 주마다 그 주에 정리하였던 부분을 올리는 방식으로라도 해결 해야 겠다.
  • 마찬가지의 이유로, 저녁을 먹고 운동을 다녀오면 시간이 생각보다 많이 소요된다 생각하여 마무리를 하고 운동을 가려하면 10시, 11시등이 넘을때가 많은데 시간도 늦고... 하다보니 게을러져서 운동을 가지 않고 있다. ㅠㅠㅠ 체력을 위해서 꼭 다녀겠다

2. Summary_Learn

  1. Spring MVC

    • Model/View/Controller 구조의 Spring Framework
    • 서블릿 API를 기반으로 클라이언트의 요청을 처리
    • [서블릿] : 웹 통신에서 요청/응답을 처리하는 자바로 작성된 객체(클래스파일)로, 요청당 쓰레드를 생성하거나 풀에서 가져와서 처리한다. Tomcat등이 이 서블릿들을 관리해주는 컨테이너
    • Model(처리결과), View(Model을 이용한 화면에 보여지는 리소스), Controller(Model과 View사이)
  2. API 계층

    • 클라이언트 <-> 서버 간의 Resource를 주고받는 계층으로, 실직적인 비니지스 업무는 담당하고 있지 않음
    • DTO객체를 통해 데이터를 전송/수신받고 비지니스로직에서 처리하기 위해 도메인 객체로 변경시켜주는 계층
    • 해당 DTO객체의 Resource가 유효한지 유효성 검증을 하기도 한다.
  3. Service 계층

    • 변환된 도메인 객체의 Resource를 실직적으로 처리하는 계층으로, Controller쪽에서 DI의존성 주입을 통해 연동하여 이를 사용
    • mapper클래스를 통해 DTO <-> Entity 객체로 변환
  4. Exception 처리

    • @ExceptionHandler를 통해 각 예외마다 예외를 처리하는 로직을 정의하거나
      @RestControllerAdvice 애너테이션으로 예외들을 한곳에서 모아서 처리하는 예외클래스를 만들어서 이를 관리한다.
  5. Spring Data JDBC기반 DB Access 계층

    • SQL 쿼리 중심, 객체 중심으로 DB에 접근하는 방법이 있는데 JDBC기반은 쿼리문으로 작성되어 있고 객체 중심기술(ORM) 추세가 바뀌며 Data JDBC인 객체기반을 사용 이후, 배우는 JPA기반에서 내부적으로 이 JDBC를 사용하여 DB에 적급한다.
    • 애그리거트와 애그리거트 루트를 이용하여 엔티티클래스 간의 관계를 설정하고 이를 기반으로 앤티티를 만들고 관계를 설정
  6. JPA기반 DB Access 계층

    • ORM기반의 DB 매핑 기술로, JPA는 ORM기술의 표준,사양(인터페이스)이고 이를 구현해놓은 구현체가 Hibernate등이 있다.
    • Hiberante 내부적으로 Data JDBC를 사용하고, 객체 중심이다.
    • 영속성 컨텍스트(Persist Context)를 사용하여 DB의 저장/수정/조회등에 사용하는 엔티티들을 영구적으로 보관해 놓았다가, tx.commit()이 호출되면 그때 쓰기지연 SQL 저장소의 SQL쿼리문을 던지면서 비워준다. commit() 내부의 em.flush()가 호출되는데 이떄 1차 캐시가 비워진다.
    • em: Entity Manager
    • tx: trasnsaction
    • 다대 다의 관계는 1대N관계를 받아주는 엔티티 테이블을 사용하여 해결
  7. 트랜잭션

    • 하나의 작업(ex. 물건구매)으로 내부적으로 여러 일들을 수행한다.
    • ACID원칙을 지키며, DB의 일관성을 유지하기 위해서 사용
  8. Testing

    • 단위테스트/슬라이스테스트/통합테스트/기능테스트 가 있고 오른쪽으로 갈수록 더욱 통합적인 테스트를 의미한다.
    • 단위테스트의 경우, 메서드 단위로 테스트를 한다.
    • 슬라이스 테스트는 특정 Layer단위로 테스트실행
    • 통합 테스트는 실제 DB와 연동하여 전체적인 기능을 보는것이고
    • 기능테스트는 사용자 입장에서 해당 앱이 잘 기능하는지 테스트
    • Junit은 테스트 프레임워크로, Assertion/Assumtion등의 라이브러리 이용
    • Assumtion은 특정 환경에서만 테스트 케이스가 실행되도록 할 수 있음
    • Hamcrest(Matcher)를 통해 Assertion을 좀더 직관적으로 확인할 수 있게 메서드를 짤 수 있다.
    • Mockito를 이용하여 DB에 연동하지 않고, 가짜 객체를 만들어주어 DB에 넘기고 받았을때를 가장하여 독립적으로 테스트를 할 수 있게 해준다.
  9. API 문서화 / Application 빌드/배포

    • Spring Rest Docs를 이용하여 스니핏을 만들고 Asciidoc을 이용하여 스니핏들을 모아 HTML등의 형태로 변경시켜준다.
    • gradle 태스크를 이용하여 애플리케이션을 빌드하고 생성된 jar파일로 실행가능
    • 서버/로컬 환경에 따라 각 profile(applcation.yml)파일을 작성하여 작성 할 수있음.
    • jar파일은(Excutable jar)파일로 자바 클래스 파일과 관련 리소스,메타데이터들을 하나의 파일로 모아 배포하기위한 파일 포맷이다.

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

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

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



3. 기술면접 정리


1. DTO란

 - Data Transfer Object의 약자로, 데이터를 전송하기 위한 객체이다.
 - DTO는 비지니스 영역에서 사용하는 도메인 객체로 직렬화/역직렬화를 시켜주는 역할을 한다.
 - 별다른 로직을 가지고있징낳고, setter/getter메서드만 가진다.
 - 서버와 클라이언트간의 데이터를 주고받을때사용하는데, 이 DTO객체를 사용하지 않으면 여러 리소스들을 각 각 개별로 하나씩 입력하여 받아야하여 코드가 굉장히 길어진다.
 - 요청에 따라 다른형태의 데이터를 요청하고 응답하는데 이에 대하여 데이터의 필요한 부분만을 넘겨 줄 수있으며, 각 데이터의 적절한 유효성 검증을 할 수 있는 장점이있다.
 - 보안적인 측면에서도 유용한데, 만약 클라이언트가 요청한 데이터에 대해 해당 DTO객체가 아닌 도메인를 넘겨주면 패스워드정보와 같은 중요한 정보도 함께들어가게 되어 DTO사용시 이를 방지


2. JPA에서의 Persist 의미

 - JPA즉, java persistence api란 자바에서 사용하는 ORM(object relational-mapping)기술로써, 객체를 기반으로 테이블과 매핑하여 데이터베이스에 저장/연동 시켜주는 기술이다.
 - JPA는 인터페이스로, 실제 이를 구현한 구현체가 Hiberante이고 이를 사용하여 한다.
 - 내부적으로는 JDBC 기술들을 사용하여 DB에 저장하고 가져온다. 
 - 개발자가 직접 SQL을 작성하지 않아도 , 이 hibernate을 메소드를 사용하여 객체를 넘겨주면 적절한 SQL문이 자동으로 해결된다.
 - persist란 엔티티를 실제 DB에 저장하는 것이 아니라, 영속성 컨텍스트에 저장하는 것이다.
 - 비지니스 영역에서 처리거나 데이터베이스에서 가져온 엔티티를 영구적으로 저장하는 것을 의미하고, 실제 commit을 하기 전까지는 이 영속성 컨텍스트에 유지되고 커밋을 하면 쓰기 지연 SQL문에 저장된 쿼리가 실행되며 이 1차 캐시가 비워지게 된다. 
 - 이는, 한번 가져온 엔티티를 반복적으로 사용할 경우 계속 DB에서 가져오는 번거로움을 없앨 수 있다.



3. 트랜잭션

 - 여러개의 작업을 하나의 그룹으로 묶어서 처리하는 단위, ACID 원칙을 지켜야한다.
 - 즉, '돈을 지불'라는 하나의 일을 의미하는것이 아니라 '물건요청 -> 돈을 지불 -> 물건을 수령'과 같은 하나의 작업을 의미
 - 데이터의 무결성(일관성)을 보장하는 핵심적인 역할이다.
 (ACID ) : 원자성, 일관성, 격리성, 지속성
 - Spring에서는 이 트랜잭션을 사용하여 데이터의 무결성을 보장하는데, 예를들어, 어떤 데이터를 저장하고 그 결과를 클라이언트에 전달받는 반환하는 과정이 있을시
   데이터를 저장하는데 까지는 성공하였지만, 반환에 실패했을시  실제 반환된 값과 저장된 값이 일치하지 않는 문제가 발생하는데 이 트랜잭션을 이용하면 전체 저장/반환을 하나의 작업으로 보아 반환에 실패하면 실제 저장된 값또한 rollback 시켜주는 역할을 하여 일관성을 유지한다.
 - 이는 AOP방식과 애너테이션 방식이 있는데, 애너테이션 방식이 더 사용하기 편리한것같다.

 - 전파/격리 
READ UNCOMMITTED : 트랜잭션 변경내용이 commit이나 rollback 상관없이 다 보여줌
READ COMMITTED : commit이 되어야지만 조회가 가능 가장많이 사용
REPEATABLE READ : 트랜잭션이 시작되기 전에 커밋내용만 조회가능
SERIALIZABLE : 읽기 작업 자체에 잠금



 



4. 향후 계획 및 다짐

  • 이제 Section4를 시작하면서 Spring Security 보안쪽을 배우게 되는데 실제적으로 SPring boot를 사용하여 서버를 갖추고 처리하는 부분은 끝낫네 싶다. 실제로 적용하려하면 굉장히 난해하고 어떻게 해야될지 모르겠을거같아, 이전에 배웠던 부분 과 특히 과제를 다시 remind하면서 좀더 익숙해 져야 할 것같다.
  • 무언가를 만드는 부분은 모두 진도가 나갔으므로, 크진 않더라도 개인적인 프로젝트나 페어분을 구해서 같이 소규모 프로젝트로 무언가를 만들어나가도 괜찮을것 같아서 이를 하려고 한다. (정규 학습 외 )
  • 기존에 목표로 하였던, GitHub에 1일 1커밋은 지금과 같이 꾸준히 해나가며, velog같은 경우 주말에라도 그 주에 배웠던 내용을 정리하여야 겠다.

  • 알고리즘 문제는 다다익선이라고, 실제 회사에 면접을 볼 때 사용하므로 꾸준히 연습하고, 체력을 키우기 위해서 저녁에 힘들더라고 간단하게 운동을 해야할 것 같다.



끝으로...

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

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

홧팅!

profile
Will be great Backend-developer

0개의 댓글