20220918_WIL
들어가며
어제는 실전 프로젝트 중간발표가 있었다. 각 조별로 MVP를 발표하고 튜터님들께 기술적 피드백과 더불어 모의면접 형태의 질문들을 받아보는 시간이었다. 내가 발표자가 아니라는 안일한 생각으로 특별한 준비 없이 발표장으로 들어갔으나 튜터님의 매서운 질문에 정신이 멍해지는 시간이었다. 금번 WIL은 중간발표 당시 제대로 답변하지 못했던 멘토님의 질문들을 다시 한번 정리하고 스스로의 현 위치를 점검해보는 시간을 가져보고자 한다.
실전 프로젝트 중간발표 CS 질문 정리
JPA(Java persistance API)
Java 진영에서 사용하는 ORM(Object - Relational Mapping) 기술 표준으로 사용되는 인터페이스 모음
(ORM - 객체와 DB data를 자동으로 Mapping 해주는 것을 의미)
장점
SQL이 아닌 Method로 DB를 조작할 수 있어 개발자가 SQL 작성에 불필요한 시간을 할애하지 않아도 된다(비즈니스 로직 구성에만 집중할 수 있다)
불필요한 Query문을 작성할 필요가 없어 코드 자체의 가독성을 높여준다.
유지보수에 용이하다(필드 추가 및 변경 시 SQL 전체를 일일히 수정하는 것이 아닌 해당 필드에 대한 내용만 수정해주면 된다)
단점
DB Table 간의 연관관계 설정을 잘못해주었을 경우 성능 저하 문제가 발생할 가능성이 있다.
복잡한 Query문 작성에는 적합하지 않을 수 있다.
JPQL(Java Persistance Query Language)
JPA에서 제공하는 Method 호출만으로 섬세한 Query문 작성이 어렵다는 문제를 극복하기 위해 탄생
객체지향 쿼리이며 SQL과 유사한 형태를 띤다.
DB Table이 아닌 Entity 객체를 검색한다.
JPQL은 SQL을 추상화하여 특정 DB에 의존하지 않는다.
(DB가 바뀌어도 JPQL을 수정하지 않아도 된다.)
JPQL도 결국에는 SQL로 반환된다.
NativeQuery
JPA가 SQL을 직접 사용할 수 있도록 제공하는 기능으로 JPA-JPQL에서 지원하지 않는 DB 종속적인 기능을 이용하기 위해 사용
QueryDSL
query 문을 안전하게 생성, 관리할 수 있도록 도와주는 프레임워크
Java 코드 기반으로 qeury 문을 작성하게끔 도와준다.(높은 가독성)
IDE를 통한 자동완성이 가능해지며 컴파일 시점에 문법적 오류를 잡아내어 잠재적 버그를 방지할 수 있게 해 준다.
JOOQ(Java Object Oriented Qeurying)
Java 코드로 Query를 작성하게끔 도와주는 DB 인터페이스
QueryDSL과 여러 부분에서 유사
유료버전과 무료 버전으로 구분되어 있음(MySQL의 경우 무료 버전에서 사용 가능)
DB Index
DB Table에 대한 검색 속도를 향상해주는 자료구조
Table의 특정 Column에 Index를 생성하면 해당 Column의 데이터를 정렬한 후 메모리 공간에 데이터의 물리적 주소와 함께 저장된다.
적절한 Index 생성 및 활용한 검색 기능의 효과적인 향상을 가져다줄 수 있다.
Reference
DB Full Table Scan VS Index Scan
Full Table Scan이란 말 그대로 특정 데이터를 찾기 위하여 DB Table 전체를 Scan 하는 것을 의미한다.
불가피한 경우를 제외하고는 지양하는 것이 바람직하며 DB 데이터가 커지면 커질수록 효율이 떨어질 수밖에 없다.
Index Scan이란 Index를 구성하는 Column 값을 바탕으로 DB 데이터를 Scan 하는 것을 의미한다.
"Index를 탄다"라고 흔히 표현하며 검색을 보다 효과적으로 만들어준다.
Reference
DNS(Domain Name Service)
인터넷 통신을 위해 사용하는 IP주소는 0~255까지 4개의 옥텟으로 구성되어있어 그 자체를 암기하는 것이 쉽지 않다. 이러한 문제를 해결하기 위해 기억하기 쉬운 도메인 주소(ex, www.naver.com)로 매핑하여 여 사용할 수 있게끔 도와주는 서비스가 바로 DNS이다.
Route 53
Amazon에서 제공하는 DNS 서비스이다. Amazon Route 53의 대표적인 기능은 도메인 주소를 대리로 등록해주는 등록대행자(Registrar)의 역헐과 네임서버를 임대해주는 역할을 수행한다.
본 프로젝트(멍냥마켓)에서는 EC2 서버와 가비아를 통해 구매했던 도메인을 연결시켜주기 위하여 사용하였다.
Reference
생활코딩, AWS - Elastic Load Balancer
Load Balancer
서버에 가해지는 트래픽을 분산 시켜주는 서비스의 통칭
서버에서 감당할 수 있는 한계 이상으로 부하가 가해지면 서버 다운으로까지 이러질 위험이 있다.
이를 해결할 수 있는 방법으로 Scale - Up, Scale - Out 2가지 방법이 있다.
Scale - Up
서버의 빠른 동작을 위해서 하드웨어의 성능을 올리는 방법
비용 부담이 더 크다
Scale - Out
서버를 증설하여 서버의 효과를 높이는 방법이며 Load Balancer를 이용한 방법이 이에 해다된다.
단일 서버였던 경우 해당 방법을 통하여 무중단 배포도 가능해질 수 있다
대체로 하드웨어를 향상시키는 방법보다 비용적으로 저렴하다.
ELB(Elastic Load Balancer)
Amazon EC2에서 제공하는 Load Balancer 서비스이다.
본 프로젝트에서는 단일 인스턴스에 연결되어있던 서버를 https 접속이 가능케끔 리스너를 추가하고, http 접속 시 https로 리다이렉트 시켜주기 위하여 사용하였다.
NGINX
경량 웹 서버
비동기 이벤트 구조를 채택하여 트래픽이 많은 웹사이트 서버에서 그 진가를 드러낸다.
Apache와 더불어 웹 서버 시장 점유율 1, 2위를 다투고 있다.
CI(Continuous Integration)
CI는 직역하자면 지속적인 통합을 의미하며 이는 빌드/테스트 자동화 과정을 뜻한다.
CI가 성공적으로 구축되었다면 새로운 코드의 변경사항(Commit)이 정기적으로 빌드 및 테스트되어 Repository에 통합되므로 매번 새로운 기능을 개발할 때 마다 빌드, 테스트, 병합 등의 번거로운 과정을 거치지 않아도되며 원천 소스코드의 충돌을 방지한다는 이점이 생긴다.
CD(Continuous Delivery / Continuous Deployment)
CD는 지속적인 제공(Continuous Delivery) 또는 지속적인 배포(Continuous Deployment) 을 의미하며 이 두 용어는 상호 교환적으로 이용됩니다.
먼저 CI를 통해 주기적으로 공용 Repository로 병합된 코드들이 자동으로 빌드 및 테스트 과정을 거쳤다면 해당 소스코드는 배포할 준비를 거치게 된다. 이후 개발팀이나 검증팀에서 해당 소스코드가 사용자에게 배포되어도 되겠다 수동적으로 검증하고 배포를 하는 것이 지속적인 제공(Continous Delivery)이다.
또는 배포할 준비가 완료되면 바로 사용자에게 배포되도록 만들 수가 있는데 이것이 지속적인 배포(Continuous Deployment)이다.
CI / CD에는 정답이 있는 것이 아닌 서비스에 따라 회사에 따라 그 방식이 차이가 있을 뿐이다.
application.properties VS application.yml
appliation.properties와 application.yml 모두 어플리케이션에서 사용하는 여러가지 설정값들, 외부 속성들을 설정하는 파일이지만 형식적인 차이가 존재한다.
application.properties
key - value 형식으로 외부 구성을 설정할 수 있다.
/* application.properties file 예시 */
spring.datasource.url=jdbc:h2:DB이름
spring.datasource.username=유저이름
spring.datasource.password=비밀번호
application.yml
YAML 기반으로 외부 구성을 설정할 수 있다.
계층 구조로 표현이 가능하기에 application.properties에서 발생되던 반복적인 prefix(접두사)를 제거할 수 있어 가독성 좋다.
/* application.yml file 예시 */
spring:
datasource:
url: jdbc:h2:DB이름
username: 유저이름
password: 비밀번호
Transaction ACID
DB Transaction이 안전하게 수행된다는 것을 보장하기 위한 4가지 성질들을 가르키는 약어
1. Atomicity(원자성)
- 한 트렉섹션 내에서 실행한 작업들은 하나의 단위로 처리
- 모두 성공 혹은 모두 실패
2. Consistency(일관성)
- 트랙섹션은 일관성있는 DB 상태를 유지
3. Isolation(격리성)
- 동시에 실행되는 트랙섹션들이 서로 영향을 미치지 않도록 격리
4. Durability(영속성)
- 트랙섹션을 성공적으로 수행하게되면 결과를 항상 저장
@Transactional
Transaction ACID를 바탕으로 @Transactional 어노테이션이 붙어있는 클래스나 메서드가 연산도중 실패하게되면 rollback되어 결과가 DB에 영향을 미치지 않게해줌
중간발표도 마쳤고 이제 실전 프로젝트도 후반부에 접어들었다. 중간발표는 내게 굉장히 유의미한 시간이었다.
스스로의 부족한 부분에 대해서 확실하게 인지할 수 있었다. 이제 개발 자체의 두려움은 어느 정도 사라져 기능을 개발함에 있어 시간만 충분히 투자한다면 구현 자체는 가능해졌다. 하지만 아직 그 정도 수준일 뿐이었다.
내가 사용한 기술이나 작성한 코드들에 대해서 완전히 이해하고 있지 못했다. 단순한 코드일지라도 확실하게 이해하고 사용해야한다는 것을 다시금 깨달았다.
중간발표는 동료들 앞에서 나의 무지가 드러난 민망한 순간이기도 하였지만 이번 일을 계기로 한 단계 성장할 수 있으리라 믿어 의심치 않는다.
남은 기간도 다시 한 번 불태워보자🔥
'WIL👨🏫' 카테고리의 다른 글
20221002_WIL(실전 프로젝트 6주차 회고 및 검색 메서드 리팩터링) (0) | 2022.10.03 |
---|---|
20220925_WIL(실전프로젝트 5주차 회고) (0) | 2022.09.25 |
20220904_WIL(실전 프로젝트 2주차 회고 및 Pageable 사용법 정리) (0) | 2022.09.04 |
20220828_WIL(클론코딩 주차 및 실전 프로젝트 1주차 회고) (0) | 2022.08.28 |
20220821_WIL(프로젝트 협업) (0) | 2022.08.21 |