<총학생회 웹사이트 개발 기록>
목차
1. 기술스택 & 패키지 구조
2. AWS EC2, RDS, S3 구축 및 보안 그룹 설정
3. JWT 이용한 Google Login System
4. 암호화 & 복호화
5. AWS EC2 배포 & 보안 그룹 설정
6. SSL 적용과 Nginx reverse proxy server 구축
7. SWAP 메모리 설정
Spring Boot & JPA 기반 RESTful API 서버를 구축하기로했다.
엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 애플리케이션 프레임워크
기존의 기술보다 불가피하게 작성해야만 했던 복잡한 코드를 제거하여 코드의 복잡성을 낮출 수 있었고, 개발자들은 비지니스 로직 구현에 더 집중할 수 있게 해준 오픈 소스 프레임워크.
프레임워크 란?
어떤한 목적을 쉽게 달성할 수 있도록 해당 목적과 관련된 코드의 "뼈대" 라고 생각하면된다.
예) 자동차를 만들때 처음부터 모든 것을 손수 만드는 것보다, 자동차의 차체를 사와서 차체에 맞는 각 부품을 만들어서 조립하는 것이 더욱 빠르고 편할 것이다. 여기서 자동차 차체가 프레임 워크라고 생각하면된다.
POJO (Plain Old Java Object)은 말 그대로, 다른 기술을 사용하지 않는 순수한 Java만을 사용하여 만든 객체인 것!
// 필드와 Getter & Setter만 존재하는 기본적인 POJO 객체의 예시
public class Example {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
...
}
POJO의 장점: 외부 기술이나 규약의 변화에 얽매이지 않아 보다 유연하게 변화와 확장에 대처할 수 있으며 객체지향 설계를 제한없이 적용할 수 있고, 코드가 단순하다는 장점이 있어서 비지니스 로직을 구현하는데 큰 장점이 있다.
Spring 에서는 POJO 프로그래밍을 위해 IoC/DI, AOP, PSA를 지원한다.
사진은 A와 B 객체의 의존 관계를 보여준다. A객체에서는 B 객체의 method를 사용하기 위해 new 키워들르 사용하여 인스턴스르 생성한 코드를 작성하고 있다. 이때 만약 아래와 같이 A 객체에서 B객체의 method가 아닌 새로운 객체 C의 method를 사용해야한다면 어떻게 될까?
example 이라는 method를 사용하는 객체가 지금은 A 한개라서 쉽게 바꿀 수 있지만 만약 수백개의 객체가 있었다면 하나하나 다 고쳐야하는 상황이 될 것이다.
스프링에서는 Interface & 추상메서드, IoC와 DI를 통해 이를 해결한다.
(1) 비지니스 로직을 수행하는 추상 메소드 example을 담고있는 Interface I를 만들고 B 와 C 객체에서는 인터페이스를 implement해서 객체들이 example method를 직접 구현하도록 한다.
(2) Class A에서는 인스턴스를 직접 생성하지 않고 생성자를 통해 Interface I 를 주입받는다. 이때 class B 혹은 class C를 주입해주는데 이것을 설정 클라스에서 개발자가 설정해놓으면 스프링에서 알아서 생성자로 넘겨준다.
이처럼 개발자가 아닌 스프링이 A가 사용할 객체를 생성하여 의존 관계를 맺어주는 것을 IoC(Inversion of Control, 제어의 역전)라고 하며, 그 과정에서 C를 A의 생성자를 통해 주입해주는 것을 DI(Dependency Injection, 의존성 주입)라고 합니다.
위의 예제에서 발생하는 코드의 중복이라는 문제를 해결하기 위해서는 공통 관심 사항과 관련된 기능들을 별도의 객체로 분리해낸 다음, 분리해낸 객체의 메서드를 통해 공통 관심 사항을 구현한 코드를 실행시킬 수 있도록 해야 합니다. 이처럼, 애플리케이션 전반에 걸쳐 적용되는 공통 기능을 비즈니스 로직으로부터 분리해내는 것을 AOP(Aspect Oriented Programming, 관심 지향 프로그래밍)라고 합니다.
스프링은 Java 백엔드 개발에 있어 핵심적인 역할을 수행하는 프레임워크이며, 백엔드 개발에서 데이터베이스는 떼어놓기 어렵습니다. 웹 서버는 데이터베이스와 소통하며 웹 클라이언트의 요청을 처리해야 하기 때문입니다. 데이터베이스의 종류는 MySQL, Oracle, Maria DB, Mongo DB 등 실로 다양합니다.
만약, 여러분이 MySQL을 사용하여 개발을 완료했는데, Maria DB로 데이터베이스를 바꿔야 하는 상황을 가정해봅시다. 이 때, 각 데이터베이스마다 사용 방법이 다르다면 어떨것 같나요? 아마 기존에 작성한 코드를 전부 지우고 새로 작성해야 하거나, 기존 데이터베이스와 새로운 데이터베이스 간에 사용 방법이 다른 코드를 모두 찾아서 일일이 수정해주어야 할 것입니다.
그러나, 스프링을 사용하면 동일한 사용방법을 유지한 채로 데이터베이스를 바꿀 수 있습니다. 이는 스프링이 데이터베이스 서비스를 추상화한 인터페이스를 제공해주기 때문에 가능합니다. 즉, 스프링은 Java를 사용하여 데이터베이스에 접근하는 방법을 규정한 인터페이스를 제공하고 있으며, 이를 JDBC(Java DataBase Connectivity)라고 합니다.
각 데이터베이스를 만든 회사들은 자신의 데이터베이스에 접근하는 드라이버를 Java 코드의 형태로 배포하는데, 이 드라이버에 해당하는 Java 코드의 클래스가 JDBC를 구현합니다. 따라서, JDBC를 기반으로 하여 데이터베이스 접근 코드를 작성해두면, 이후에 데이터베이스를 바꾸어도 기존에 작성한 데이터베이스 접근 로직을 그대로 사용할 수 있습니다.
이러한 JDBC처럼 특정 기술과 관련된 서비스를 추상화하여 일관된 방식으로 사용될 수 있도록 한 것을 PSA(Portable Service Abstraction, 일관된 서비스 추상화)라고 합니다.
(1) Project : 빌드 툴을 선택합니다.
(2) Language : 프로젝트에 사용하고자 하는 프로그래밍 언어를 선택합니다.
(3) Spring Boot : 스프링 부트의 버전을 선택합니다. 버전 이름 뒤에 아무 것도 붙지 않은 버전 중, 가장 최신 버전을 선택합니다.
SNAPSHOT : 아직 개발이 완료되지 않은 버전을 의미합니다.
M(Milestone) : 개발은 완료되었으나, 아직 기능들을 개선하는 중 또는 버그를 수정하고 있는 버전을 의미합니다.
RC(Release Candidate) : 기능 개선과 버그 수정이 완료되었으나, 최종적으로 릴리즈되지는 않은 버전을 의미합니다.
(4) Project Metadata : 프로젝트의 정보를 입력합니다.
Group : 프로젝트를 만드는 그룹의 이름으로, 보통 기업의 도메인 명을 역순으로 입력합니다. 여기에서는 com.codestates로 입력하겠습니다.
Artifact : 빌드 결과물의 이름입니다.
Name : 프로젝트의 이름입니다.
Description : 프로젝트에 대한 간략한 설명을 입력합니다.
Package name : 프로젝트에 생성할 패키지를 설정합니다.
Packaging : 배포를 위해 프로젝트를 압축하는 방법을 선택합니다.
Java : 여러분의 PC에 설치된 JDK의 버전을 선택하면 됩니다.
(5) Dependencies : 프로젝트를 통해 만들 애플리케이션의 동작에 필요한 라이브러리들을 선택합니다.
MVC는 프로젝트를 구성할 때 Model, View, Controller의 역할로 구분하는 패턴입니다.
애플리케이션의 정보, 데이터를 나타냅니다. 데이터베이스, 처음의 정의하는 상수, 초기화값, 변수 등을 의미합니다.
추가로 이러한 데이터를 파싱하거나 데이터베이스와의 통신 또한 책임지는 컴포넌트(비지니스 로직)입니다.
모델의 규칙
1. 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.
2. 뷰나 컨트롤러에 대해서 어떤 정보도 알지 말아야 한다.
3. 변경이 일어나면, 변경 통지에 대한 처리방법을 구현해야만 한다.
사용자가 보는 화면, 즉 input 텍스트, 체크박스 항목 등과 같은 사용자 인터페이스 요소를 의미한다. 데이터를 기반으로 사용자들이 볼 수 있는 화면이다.
View의 규칙
1. 모델이 가지고 있는 정보를 따로 저장해서는 안된다.
2. 모델이나 컨트롤러와 같이 다른 구성요소를 몰라야 한다.
3. 변경이 일어나면 변경 통지에 대한 처리방법을 구현해야만 한다.
Model과 View의 중간다리 역할을 한다.
즉, 사용자가 데이터를 클릭하고, 수정하는 것에 대한 "이벤트"들을 처리하는 부분을 의미한다.
컨트롤러의 규칙
1. 모델이나 뷰에 대해서 알고 있어야한다.
2. 모델이나 뷰의 변경을 모니터링 해야 한다.
DAO
DAO(Data Access Object) 는 데이터 베이스에 접근하기 위한 객체이다. DataBase에 접근하기 위한 로직 & 비지니스 로직을 분리하기 위해 사용
DTO
DTO(Data Transfer Object) 는 계층 간 데이터 교환을 하기 위해 사용하는 객체로, DTO는 로직을 가지지 않는 순수한 데이터 객체 (getter & setter 만 가진 클래스) 이다.
VO
VO(Value Object) 는 값 오브젝트로써 값을 위해 쓰입니다. read-Only 특징(사용하는 도중에 변경 불가능하고, 오직 읽기만 가능)을 가지고 있다.
DTO와 유사하지만 VO는 getter만 가진 클래스
구조예시
Presentation Layer
Controller, Reuqest, Response 객체 저장
Application Layer
Service, DTO 저장
Domain Layer
Entity, JPARepository 저장
지금까지 스프링과 스프링 부트가 무엇인지, 그리고 스프링 부트를 사용하여 프로젝트를 생성하는 방법까지 살펴보았습니다. 앞서 설명드렸던 내용을 한번 더 정리해보면 다음과 같습니다.