코드스테이츠에서 부트캠프를 시작한지 이제 절반의 시간이 지나갔다. 뭐가 나 자신은 크게 달라진 것 같지 않은데 벌써 이만큼의 시간이 흘렀고 이제 한 섹션만 더 지나면 프로젝트를 해야된다니 앞길이 막막하다.
그래도 처음과 달리 나 자신은 많은 부분이 성장한 것 같은데, 전체적으로 혼자서 딱 하나 만들어보세여! 하면 힘들지만, 이 부분의 코드들이 어떤 역할을하고 어떠한 형식으로 이 프로젝트들이 구현되어있는지 정도는 알아볼 수 있을정도는 되는 것 같다. (ㅇㅁ ㅇ .. 나란남자)
이번 Section3에서는 Spring MVC(Model, View, Controller)로, REST API를 통해 웹의 기존기술과 HTTP 프로토콜을 이용하여 API/Service/DB 계층을 거치며 '클라이언트-서버'에서 데이터를 주고받고 이를 DB에 저장하고 받아오는 부분을 연습하였다.
여기에 추가적으로, 유효한 Resource를 받기위한 적절한 유효성 검증과 DB의 일관성을 유지하기 위한 트랜잭션, 최종적으로 배포하는 방법을 학습하였다.
기존에는 사용하기만 하였던 웹 기술들을 실제로 코드로 작성하여 돌아가는 방식을 이해하고 이를 작성하니 굉장히 뿌듯하엿다.
다른 부분도 중요하지만, 이 부분과 Spring boot 기술들과 자료구조/알고리즘 부분은 정말 꾸준히 공부하여 최대한 흡수를 하여야 겠다.
Spring MVC
API 계층
Service 계층
Exception 처리
Spring Data JDBC기반 DB Access 계층
JPA기반 DB Access 계층
트랜잭션
Testing
API 문서화 / Application 빌드/배포
배웠던 내용들의 정말 핵심적인 요소들만 간결하게 적었는데도 굉장히 많은 내용을 배웠구나.. 하는 생각이 든다.
이전과 마찬가지로, 코드스테이츠에서 기술면접을 통해 각 원하는 내용들을 학습하고 이를 토대로 페어와 각 모의 기술면접을 하여 잘 이해가 안갔던 부분에 대한 내용을 추가적으로 학습하였다.
이를 심화적으로 공부하게 되었고 같은 내용이라도 다른이들의 모의면접을 보면서 나는 사용하지 않았지만 그 분은 사용하였던 용어나 내용들을 추가로 들을 수 있어서 좋았다.
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 : 읽기 작업 자체에 잠금
기존에 목표로 하였던, GitHub에 1일 1커밋은 지금과 같이 꾸준히 해나가며, velog같은 경우 주말에라도 그 주에 배웠던 내용을 정리하여야 겠다.
알고리즘 문제는 다다익선이라고, 실제 회사에 면접을 볼 때 사용하므로 꾸준히 연습하고, 체력을 키우기 위해서 저녁에 힘들더라고 간단하게 운동을 해야할 것 같다.
아직 끝을 향하려면 먼 길이지만 꾸준히 몸관리도 하며 결코 빠르지는 못해도 꾸준히 학습해가며 훌륭한 프로그래머가 되고자 한다 !!
앞으로 점점 더 어려워질 것 같은데, 어렵더라도 포기하지 않고 끝까지 수료하며, 부족한 부분은 주말에 복습하여야 겠다.