항해 99 (6기)/SIL(Sometimes I Learned)

2022_04_01 SIL(항해 26일차)

태투2 2022. 4. 2. 00:14

 

1. 회고

드디어 힘들었던 나만의 블로그 만들기 프로젝트가 끝났다.. 일단 배포는 했고(사실 테스트 코드는 엄두도 못냄) .. 했다. ㅎㅎㅎ 

불과 화요일까지만 해도 프로젝트를 끝낼 수 있을거라는 기대가 없었다. 당시 상황이 그랬다.. 과거 항해 수료생들의 소스코드(깃헙 참고)들을 봐도 전혀 알 도리가 없고, 참 막막했다.

근데 수요일부터 뭔가 내 신상에 변화가 있었다. 갑자기 만신이 오셨나?.. ㅎㅎ 코드가 술술 쓰이고 서칭하는 내용 족족 맞아들어가서 나의 코드에 문제가 없게된 것이다. 지저분하고 어지러웠던 컨트롤러 부분도 아예 새로 갈아 엎어서 정리하고 뭔가 내가 지금 하고 있는 개발의 흐름을 파악했다고 해야하나? 갑자기 왜 하루만에 이렇게 달라졌는지,, 참 신기했다..

근데 돌이켜 생각해보니 나는 이제까지 뭔가 받아들일 생각은 1도 없었던 것 같다. 남들의 코드를 보고도 아 그냥 저 사람이 작성한 코드 그 이상 그 이하도 아닌 ,, 뭐 이렇게 안일하게 생각하면서 지난 4주 가까이를 보냈던 것이다. 확실히 사람이 벼랑 끝에 몰려야 살려고하는 기지를 발휘한다는데, 딱 내가 그랬다. 코드를 다시 하나하나 집어보고 다른 코드를 참고할 때도 쓰인 Annotation 하나하나의  의미까지 다 파악하면서 코드를 써내려가기 시작했다. 뭐 물론 내가 한 방법이 바이블이 아니라서 이렇게 하세요!!! 라고 강조할 수는 없지만, 내가 강의를 계속 반복 하면서 프로젝트를 진행할 용기 없었기 때문에 이렇게라도 코드 하나하나를 곱씹으면서 수행하려고 노력했다.

프로젝트를 대폭 수정하고 정리하면서, 이전 며칠간 혼자 고민하면서 언제 멈출지 모르는? 언제라도 경로 문제 에러가 발생할 수 있는 나의 컨트롤러를 붙잡고 프로젝트를 이어 나갔던 삽질의 시간이 너무 아까웠다. 이 또한 배움의 과정이라...(이런 배움의 과정은 스트레스와 탈모만 야기함) 생각하고 오늘 새로 발제된 과제(배달앱 API 만들기)는 좀 더 체계적이고 영특하게 준비해 볼 생각이다.

앞서 어중이떠중이로 준비했던 과정과 다르게, 과제 진행의 로드맵을 제대로 설정해서 힘들지 않게(밤잠 설치면🥲) 진행할 계획이다.

무튼 오늘의 한마디, 절대 대충 봐서 얻는 지식 없고, 성장을 위해선 열정적으로 몰입해야 한다!!

2. 배운내용

ORM, JPA, Spring Data JPA의 개념

ORM 👉ORM(Object-Relational Mapping)

우리가 일반적으로 알고 있는 애플리케이션 Class와 RDB(Relational DataBase)의 테이블을 매핑(연결)한다는 뜻이며, 기술적으로는 어플리케이션의 객체를 RDB 테이블에 자동으로 영속화 시켜주는 것이다.

 

장점

  • SQL문이 아닌 Method를 통해 DB를 조작할 수 있어, 개발자는 객체 모델을 이용하여 비즈니스 로직을 구성하는데만 집중할 수 있다.(내부적으로는 쿼리를 생성하여 DB를 조작하다. 하지만 개발자가 이를 신경 쓰지 않아도 된다.)
  • Query와 같이 필요한 선언문, 할당 등의 부수적인 코드가 줄고, 각종 객체에 대한 코드를 별도로 작성하여 코드의 가독성을 높인다.
  • 객체지향적인 코드 작성이 가능하다. 오직 객체지향적 접근만 고려하면 되기때문에 생산성 증가
  • 매핑하는 정보가 Class로 명시 되었기 때문에 ERD를 보는 의존도를 낮출 수 있고 유지보수 및 리펙토링에 유리하다.
  • 만약 기존 방식에서 MySQL 데이터베이스를 사용하다가 PostgreSQL로 변환한다고 가정해보면, 새로 쿼리를 짜야하는 경우가 생기는데, 이런 경우에 ORM을 사용한다면 쿼리를 수정할 필요가 없다.

단점

  • 프로젝트의 규모가 크고 복잡하여 설계가 잘못된 경우, 속도 저하 및 일관성을 무너뜨리는 문제점이 생길 수 있다.
  • 복잡하고 무거운 Query는 속도를 위해 별도의 튜닝이 필요하기 때문에 결국 SQL문을 써야할 수도 있다.
  • 학습 비용이 높은 편이다.

JPA(Java Persistence API)

Java 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용하는 인터페이스 모음

자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스이다. 인터페이스 이기 때문에 Hibernate, OpenJPA 등이 JPA를 구현한다.

 

JPA의 범용성

  • JPA는 반복적인 CRUD SQL을 처리해준다. JPA는 매핑된 관계를 이용해서 SQL을 생성하고 실행하는데, 개발자는 어떤 SQL이 실행될지 생각만하면 되고, 예측도 쉽게 할 수 있다. 추가적으로 JPA는 네이티브 SQL이란 기능을 제공해주는데 관계 매핑이 어렵거나 성능에 대한 이슈가 우려되는 경우 SQL을 직접 작성하여 사용할 수 있다.
  • JPA를 사용하여 얻을 수 있는 가장 큰 것은 SQL아닌 객체 중심으로 개발할 수 있다는 것이다. 이에 따라 당연히 생산성이 좋아지고 유지보수도 수월하다. 또한 JPA는 패러다임의 불일치도 해결하였다. 예를 들면 JAVA에서는 부모클래스와 자식클래스의 관계 즉, 상속관계가 존재하는데 데이터베이스에서는 이러한 객체의 상속관계를 지원하지 않는다(상속 기능을 지원하는 DB도 있지만 객체 상속과는 다름). 이런 상속관계를 JPA는 아래와 같은 방식으로 해결하였다.

JPA, Hibernate, Spring Data JPA

JPA와 Spring Data JPA는 똑같이 JPA가 들어가서 처음 접할 경우 같은 것이라 생각 할 수 있지만, 아래 이미지를 통해 이 세 개념의 차이점을 정확히 인지하고 있으면 개발이 한층 편해질 것이다.

하이버네이트 (Hibernate)

JPA 는 표준 명세이고, 이를 실제 구현한 프레임워크 중 사실상 표준 이다. 스프링 부트에서 기본적으로 "하이버네이트" 사용중이다.

사실상 표준 (de facto, 디팩토)은 보통 기업간 치열한 경쟁을 통해 시장에서 결정되는 비공식적 표준이다.

 

Spring Data JPA

  • Spring 개발환경에서 JPA를 편리하게 사용할 수 있도록 기존 JPA을 wrapping하여 만들어진 기술
  • JPA를 사용할 때 필수적으로 작성해야하는 것들, repository 인터페이스를 사용할 때 필수적으로 해야하는 구현체 만드는 작업 등을 Spring JPA가 대신 해주면서 더욱 편리하게 데이터 관련 작업을 가능하게 함

 

 

 

 

 

 

3. CS 스터디

Controller 와 RestController 의 이해

https://taehyeonkim.notion.site/Controller-VS-RestController-48994d69583843549d3afd07806218c0