
1. 프로그래밍 언어는 Java를 사용합니다.
- 현재 프로젝트의 백엔드 개발 인원들에게 가장 익숙하다.
- 높은 안정성 지니고 있다.
- 수많은 산출물들과 오픈소스, 그리고 경험들이 웹상에 분포되어 있어서 참조할 수 있는 래퍼런스가 많다.
- 국내 개발 시장에서 점유율이 가장 높고 해당 프로젝트가 취업을 목표로 하는 포토폴리오이기 때문에 수요가 많은 자바 언어는 취업에 유리하다.
- 언어가 강력하고 데이터 타입과 예외 처리에 엄격하기 때문에 컴파일 오류 단계에서 버그를 쉽게 찾아낼 수 있다.
- 객체지향 개념을 가장 정확하게 적용하고 있어서 유지보수에 좋고 높은 확장성을 지닌다.
- 언어 차원에서 스레드를 지원한다.
- jcf, stream, optional, lamda과 같은 편리한 라이브러리를 제공한다.
2. 프레임워크는 Spring Framework와 Spring Boot를 사용합니다.
- 스프링 프레임워크는 사실상 자바의 표준 프레임워크이다.
- 스프링 빈을 스프링 컨테이너에 등록하기만 하면 자동으로 의존성이 주입되고 싱글톤으로 관리된다.
- 필요에 따라 스프링 빈을 자동 혹은 수동으로 등록할 수 있다.
- 필요에 따라 싱글톤이 아닌 프로토타입으로 생성할 수도 있다.
- 스프링 프레임워크는 AOP (관점지향 프로그래밍)를 지원한다.
- 프록시 패턴으로 공통 모듈을 자동으로 만든 다음 그 곳에서 공통 관심사를 처리할 수 있다.
- AOP는 보안, DB 통신, 로깅, 파일 입출력 등 많은 부가적 관심사에 적용이 가능하다.
- 스프링 프레임워크는 애노테이션 기반의 스프링 MVC를 제공한다.
- 스프링 MVC는 디스패처 서블릿, 핸들러 어댑터, 뷰리졸버 등을 이미 구현해놓았기 때문에 사용자는 컨트롤러에만 코드를 작성하면 되고 코드의 중복을 줄일 수 있다.
- 스프링 MVC는 인터페이스를 구현해서 사용하는 것이 아닌 애노테이션을 사용하기 때문에 편리하게 웹개발을 할 수 있다.
- 컨트롤러의 단위가 메소드 단위이기 때문에 도메인을 기준으로 하나의 클래스에서 다수의 컨트롤러를 관리할 수 있다.
- 정적 컨텐츠, 뷰 렌더링, API 중에서 응답 값을 선택적으로 반환할 수 있다.
- 요청된 URL을 쉽게 매핑할 수 있고 URL의 경로 변수 값을 직접 사용할 수 있다.
- 타입에 상관없이 Request에서 보낸 값을 편리하게 받아 처리할 수 있다.
- 스프링 프레임워크는 트랜잭션 관리를 편리하게 할 수 있다.
- @Transaction 애노테이션을 사용하면 자동으로 프록시 패턴의 구현체를 생성하여 트랜잭션을 시작한 다음 서비스 로직을 수행한다. 그리고 서비스 로직이 종료되면 구현체는 커밋이나 롤백을 수행한다.
- 생성된 프록시는 트랜잭션을 시작하기 전에 트랜잭션 매니저 생성 및 커넥션 연결을 자동으로 수행한다.
- 그 외 스프링 프레임워크는 검증, 메시지, 인터셉터, 기본 오류 페이지, API 예외 처리, 스프링 예외 추상화 등 기타 편리한 기능을 제공한다.
- 스프링의 Bean Validation과 메시지를 사용해서 검증 오류 메시지를 쉽게 보여줄 수 있다.
- 스프링의 인터셉터를 사용하면 컨트롤러 호출 전, 호출 후, 뷰 렌더링 후 등의 시점에서 특정 행위를 공통으로 적용할 수 있다.
- 스프링의 BasicErrorController를 사용하면 편리하게 기본 오류 페이지를 보여줄 수 있다.
- 스프링의 ExceptionHandler를 사용하면 마치 MVC의 컨트롤러를 사용하는 것처럼 편리하게 API 예외를 처리할 수 있다.
- 스프링은 체크 예외를 스프링이 추상화한 런타임 예외로 변환하는 기능을 제공한다.
- 스프링 부트는 스프링 프레임워크를 편리하게 사용하도록 지원하기 때문에 스프링 사용시 필수이다.
- Starter를 이용해 특정 기능에 필요한 라이브러리 의존성을 간단히 처리할 수 있다.
- Tomcat과 같은 내장 웹서버를 제공하며 JAR로 패키징하여 사용할 수 있다.
- 자주 사용되는 라이브러리들의 버전 관리를 자동으로 처리한다.
- 스프링과 외부 라이브러리의 호환을 위한 설정을 자동으로 수행한다.
- JUnit과 같은 테스트 라이브러리들이 기본적으로 포함되어 있기 때문에 다양한 계층의 클래스에 대해서 테스트 케이스를 쉽게 작성할 수 있다.
3. 데이터베이스는 MYSQL과 NoSQL 데이터베이스인 Redis를 사용합니다.
- 관계형 데이터베이스로 MYSQL을 사용한다.
- 오픈 소스 라이센스를 따르기 때문에 무료로 사용할 수 있다.
- 표준 SQL 형식을 사용하며 다양한 운영체제에서 사용할 수 있다.
- 크기가 큰 데이터 집합도 아주 빠르고 효과적으로 처리할 수 있다.
- 캐시 데이터베이스로 Redis를 사용한다.
- “Key-Value” 구조이기 때문에 쿼리를 사용할 필요가 없고 디스크가 아닌 메모리에서 데이터를 처리하기 때문에 속도가 빠르다.
- MYSQL 접근 전에 Redis에 먼저 접근하면 데이터에 빠르게 접근할 수 있고 비용이 많이드는 MYSQL에 대한 접근을 줄일 수 있다.
- 따라서 Redis에 사용 빈도가 높고 변경 가능성이 낮은 데이터를 저장한다면 더 빠르게 데이터를 처리할 수 있다.
4. 데이터베이스 프레임워크는 JPA + Querydsl + Spring Data JPA를 사용합니다.
- ORM 프레임워크인 JPA를 사용하면 SQL 중심의 개발에서 벗어나 객체 지향 중심의 개발을 할 수 있다.
- 자바 객체를 DB 테이블에 맞추어 모델링하거나 SQL로 직접 매핑할 필요가 없다.
- 자바 컬렉션에 객체를 저장, 조회, 수정, 삭제하는 것처럼 DB를 사용할 수 있다.
- 간단한 CRUD 쿼리에 대해서 생산성이 높다.
- JPA는 내부적으로 성능 최적화 기능이 있다.
- Spring Data JPA는 JPA 사용시 자주 사용되는 CRUD 메소드를 미리 만들어 놓고 그것을 인터페이스로 제공한다.
- JpaRepository에는 자주 사용되는 간단한 CRUD 메소드들이 포함되어 있기 때문에 이를 상속하면 직접 구현하지 않고 CRUD 메소드를 사용할 수 있다.
- 따라서 스프링 데이터 JPA를 사용하면 중복 개발의 수고를 줄일 수 있다.
- 메소드 이름을 분석해서 쿼리를 자동으로 만들고 실행해주는 쿼리 메소드 기능을 제공한다.
- Pageable을 통해서 페이징 기능도 쉽게 구현할 수 있다.
- Querydsl을 사용하면 SQL을 자바 코드로 작성할 수 있고 메소드 체이닝으로 쿼리문을 만들기 때문에 동적 쿼리를 쉽고 편리하게 작성할 수 있다
- SQL을 자바 코드로 작성하면 문법의 오타가 있거나 타입이 틀렸을 때 컴파일 오류를 발생시켜 컴파일 단계에서 오류를 인지할 수 있다.
- 메소드 체이닝으로 쿼리문을 만들기 때문에 가독성이 좋다.
- 쿼리 조건을 부분적으로 모듈화할 수 있고 다른 조건절에 재사용할 수 있다.
5. 버전관리 시스템은 Git과 Github를 사용합니다.
- Git은 프로젝트 진행시 필수적인 버전 관리 도구이다.
- Github는 팀 프로젝트를 진행할 때 공유 코드를 저장할 수 있는 원격 저장소이다.
- Git이 개인 작업사항에 관한 버전관리라면 Github는 전체 프로젝트에 대한 버전관리이다.
- 실시간으로 작업 사항을 업데이트할 수 있으며 업로드 된 작업의 로그를 살펴볼 수 있다.
- 버전별로 작업 사항을 저장하기 때문에 이전 버전으로 쉽게 백업할 수 있다.
- branch를 사용해서 프로젝트의 새로운 분기를 만들어 독립적으로 개발을 진행하고 이후 merge를 사용해서 두 분기를 병합할 수 있다.
- 따라서 병렬적으로 개발이 가능하며 특정 분기에 대한 사용을 선택할 수 있다.
- 작업 사항 업로드 중 충돌이 발생하면 충돌된 두 코드를 분리해서 사용자에게 보여주고 그 중 하나를 선택하도록 알려주기 때문에 충돌이 일어나도 쉽게 해결할 수 있다.
- push와 pull을 이용하여 편리하게 저장소에 작업 사항을 업로드하거나 다운로드할 수 있다.
- Github는 협업시 커뮤니케이션을 위해 추가적인 편리한 기능을 제공한다.
- 프로젝트 진행 중 발생하는 여러 이벤트들에 대해서 인원들이 원할하게 의사소통할 수도록 issue라는 공간을 제공한다.
- pull request를 사용해서 팀의 인원들에게 작업물의 병합을 요청할 수 있고 작업물에 대한 의견을 나눌 수 있다.
- wiki를 이용해서 편리하게 프로젝트를 문서화할 수 있다.
6. API 설계원칙은 REST API를 사용합니다.
- 서버와 클라이언트 사이에서 API를 설계하고 통신 규약을 지정하는 첫 프로젝트이기 때문에 가장 보편적인 REST API를 사용한다.
- REST API는 HTTP 프로토콜의 인프라를 그대로 사용하기 때문에 별도의 인프라를 구축할 필요가 없으며 웹의 장점을 최대한 활용할 수 있다.
- REST API 메시지의 HTTP 메소드와 URL 정보를 보면 메시지에 대한 의도가 명확하게 명시되어 있어 직관적이다.
7. 빌드 관리 도구는 Gradle을 사용합니다.
- 해당 프로젝트 구성원들이 maven 보다 gradle이 더 익숙하다.
- maven은 xml로 라이브러리를 적용하고 설정하지만 빌드와 같은 동적인 요소를 xml로 정의하기엔 어려운 부분이 많다.
- gradle은 별도의 빌드 스크립트를 통하여 사용할 어플리케이션 버전, 라이브러리 등을 설정할 수 있다. 그리고 groovy 스크립트 언어로 구성되어 있기 때문에 xml과 다르게 동적으로 로직을 구현할 수 있다.
- gradle이 maven보다 시기적으로 최근에 만들어졌기 때문에 코드량, 가독성, 사용성, 성능, 속도 등 보다 뛰어난 스펙을 가진다.
- 빌드 도구에 많이 익숙하지 않고 빌드 도구를 사용하는 첫 프로젝트인 것을 감안했을 때 maven보다 gradle을 사용하는 것이 향후 더 유리할 것이라 판단된다.
8. 테스트 프레임워크는 JUnit을 사용합니다.
- jUnit은 Java 프로그래밍시 사용하는 사실상 표준 테스트 프레임워크이다.
- System.out.println() 로 일일이 로그를 남겨서 테스트 결과를 확인할 필요가 없다.
- Assert 메서드를 통해서 테스트를 수행하면 해당 테스트의 성공 여부만 알려주고 만일 실패했다면 기대값과 실제 값을 비교해서 출력한다.
- 테스트 결과는 Test 클래스로 개발자에게 테스트 방법 및 클래스의 History를 공유한다.
- 웹서버나 WAS의 구동없이 설정 파일만 로딩시켜서 테스트를 수행할 수 있다.
- 어노테이션(Annotation)으로 간결하고 편리한 테스트를 작성할 수 있다.