갑자기 Spring을 선택하게 된 이유?
나는 백엔드 개발자가 되고 싶다.
그래서 django를 이용해 웹 서버도 만들어보고, 졸업 프로젝트에서도 웹 개발을 해보고 했지만, 부족하다는 느낌이 들었다.
가장 큰 이유는 '우리나라의 취업시장'이었다. 우리나라의 취업시장, 그리고 대표적인 "네카라쿠배"는 모두 JAVA/Spring을 사용한다. 나도 웹개발자로서 국내에서 이름 알리는 대기업에 들어가기 위해서는 그에 맞춰야 한다는 생각이 들었다.
동시에 내가 지금까지 한 것은 헛된 것인가, 양산형처럼 꼭 해야 할까, 하는 고민이 들었다. 그 고민의 끝은 "둘 다 잘하자"였다.
django로도 개발경험을 갖추고, spring으로도 개발 경험을 갖추고, 그리고 그 둘의 차이점과 언제 사용하면 좋을지, 각각의 프레임워크는 어떤 방식으로 개발을 진행하는지 등 비교해보면서 공부해볼 예정이다.
About Spring
본격적으로 스프링 공부에 앞서, 스프링이 무엇인가에 대해 살펴보겠다.
⭐스프링(Spring) 정의
엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 애플리케이션 프레임워크
이 정의를 하나하나 뜯어서 각각 어떤 의미를 갖는지 깊이 살펴보도록 하자.
엔터프라이즈용 Java 애플리케이션 개발을편하게 할 수 있게 해주는
- 기업에서 운영하는 웹 서비스에는 비즈니스 로직이 있다.
- 비즈니스 로직: 기업이 제공하는 서비스를 코드로 구현한 것으로, 사용자의 요구사항을 해결하기 위한 실질적인 코드
- 스프링 이전에는 비즈니스 로직을 구현하기 위해 기술 자체에 대한 공부를 추가적으로 해야 했음. 비즈니스 로직 구현 기술이 복잡하고 어렵기 때문!
- 그러나 스프링은 이전 기술에 비해 사용 방법이 덜 복잡함. 따라서, 개발초기에 기본적인 설정과 적용시킬 기술들만 잘 선택해주면, 기술보다 애플리케이션 로직 자체에 더 집중해서 비즈니스 로직 구현 가능
오픈소스
- 오픈소스 : 사용자에게 무료로 열려있음
- 장점 : 여러 사람이 프로젝트의 코드를 사용 → 다양한 검증 과정 거칠 수 있음
- 단점 : 뚜렷하게 정해진 인원이 프로젝트 개발 관리를 맡는 것이 아님 → 프로젝트의 개발과 개선이 안정적이지 못함
- 즉, 프레임워크의 불안정성이 존재함
- 스프링의 차별점
- 스프링도 마찬가지로 오픈소스. 필요하다면 스프링의 코드 일부 수정 가능
- 다른 오픈소스와 달리, 오픈소스 프레임워크이지만, 안정적인 개발과 개선이 보장됨.
- WHY?
- 스프링소스(SpringSource)라는 IT기업에서 관리함
- 스프링 소스 코드 수정 및 개선 업무는 한정적인 인원만 참여 가능
경량급
- ‘경량급’이란 의미는 기존에 스프링 대신에 사용하던 기술들과 비교하였을 때, 스프링을 사용하면 개발자가 작성해야 한느 코드가 상대적으로 단순하다는 의미!
- 스프링 등장하기 이전에는 EJB(Enterpirse JAVA Bean)라는 기술이 주로 사용됨.
- 많은 기술의 단점을 보완하지만, 여전히 불필요하게 복잡한 코드를 작성해야 했음.
- 스프링은 불필요한 코드를 걷어내고 코드의 복잡성을 줄어낸 프레임워크
애플리케이션 프레임워크
- 웹 개발에 있어 프레임워크 :
- 어떠한 목적을 쉽게 달성할 수 있도록 해당 목적과 관련된 코드의 뼈대를 미리 만들어둔 것
- 특정 업무 분야 혹은 하나의 기술의 목적을 편리하게 달성할 수 있기 위해 만들어짐
- 애플리케이션 프레임워크 :
- 특정 업무 분야 및 특정 기술이 아니라, 애플리케이션 개발이 필요한 모든 과정에 집중함
- 개발하는데 있어 필요한 모든 업무 분야 및 모든 기술과 관련된 코드의 뼈대를 제공함
엔터프라이즈용 Java 애플리케이션 개발을 편하게 할 수 있게 해주는 오픈소스 경량급 애플리케이션 프레임워크
이러한 스프링의 정의를 토대로 스프링은,
- 애플리케이션의 비즈니스 로직 구현이 가능
- 안정성과 개발과 개선이 보장된 오픈소스
- 불필요하고 복잡한 코드를 제거함
- 개발에 있어 필요한 모든 업무에 대한 뼈대 제공
이렇게 정리할 수 있겠다.
⭐스프링 특징
1) POJO 프로그래밍 지향
2) IoC / DI (Inversion of Control / Dependency Injection, 제어의 역전 / 의존성 주입)
3) AOP (Aspect Oriented Programming, 관심 지향 프로그래밍)
4) PSA (Portable Service Abstraction, 일관된 서비스 추상화)
1) POJO 프로그래밍을 지향
- POJO(Plain Old Java Object) : 순수 Java만을 통해서 생성한 객체
- JO의 의미보다는 PO에 더 집중해야 한다.
- 순수 Java만 사용한다는 것의 의미: “Java 및 Java의 스펙에 정의된 기술만 사용한다”
- 어떤 객체가 외부의 라이브러리나 외부의 모듈을 가져와서 사용하고 있다 ⇒ POJO 아님
- 다른 기술을 사용하지 않는 순수한 Java만 사용하여 만든 객체
POJO가 중요한 이유
- 외부 라이브러리 사용한 경우
- 해당 기술을 사용하고 있는 모든 객체들의 코드를 전부 바꿔주어야 함
- 해당 객체는 외부 모듈에 의존하고 있기 때문에 자연스럽게 발생하는 문제임.
- POJO를 사용한 경우
- 특정 기술이나 환경에 종속되지 않음
- ⇒ 외부 기술이나 규약의 변화에 얽매이지 않아 보다 유연하게 변화와 확장에 대처할 수 있음
- ⇒ 객체지향 설계를 제한없이 적용 가능, 코드가 단순해져 테스트 및 디버깅이 쉬워짐
아래 IoC/DI, AOP, PSA는 모두 POJO 프로그래밍을 위해 스프링이 지원하는 기술이다. 찬찬히 살펴보자
2) IoC / DI (Inversion of Control / Dependency Injection, 제어의 역전 / 의존성 주입)
- 위 코드는 “A가 B에 의존하는 관계”이다. 이는 개발자에 의해 만들어짐.
- 하지만 여기서, A가 사용할 객체가 B가 아니라, 새롭게 C를 정의해서 사용하고자 한다면? A코드를 변경해야 한다.
- 위 코드처럼 변경해야 함. 하지만 만약 기존에 V를 사용하던 객체가 A뿐만 아니라 수십 또는 수백개가 있다면 모든 객체의 코드를 수정해야 함
- 반면에 이 코드는 자신이 사용할 객체를 스스로 생성하지 않고, 생성자를 통해서 외부로부터 받아오고 있다. 여기서 A는 자신이 사용할 객체를 알지 못하며, 그저 i에 할당된 인스턴스에 example() 이 존재한다는 것만 알고 있음
- 이때 스프링이 A든, B든, C든 example()를 호출해서 객체를 별도로 설정한다.
- 즉, 개발자가 설정 클래스 파일에 A가 사용할 객체를 C로 설정해두면, 애플리케이션이 동작하면서 스프링이 설정 클래스 파일을 해석하고, 개발자가 설정해둔대로 C객체를 생성하여 A의 생성자의 인자로 C를 전달한ㄴ다.
- 개발자가 아닌 스프링 내 클래스 A가 사용할 객체를 생성하여 의존 관계를 맺어주는 것을 IoC(Inversion of Control, 제어의 역전)라고 하며, 그 과정에서 C를 A의 생성자를 통해 주입해주는 것을 DI(Dependency Injection, 의존성 주입)라고 한다.
3) AOP (Aspect Oriented Programming, 관심 지향 프로그래밍)
- 애플리케이션을 개발할 때 구현해야 하는 기능 : 공통 관심 사항, 핵심 관심 사항
- 핵심 관심사항: 애플리케이션의 핵심기능과 관련된 관심사항
- ex. 커피 주문 애플리케이션 - 메뉴 등록하기, 주문하기, 주문 변경하기 등
- 공통 관심사항: 모든 핵심 관심 사항에 공통적으로 적용되는 관심 사항을 의미
- 모든 핵심 관심사항은 로깅이나 보안 등과 관련된 기능들이 공통적으로 적용되어야 함
- 이때, 핵심 관심 사항과 공통 관심 사항이 위와 같이 코드에 함께 모여있으면 공통 관심사항과 관련된 코드가 중복될 수밖에 없음 ⇒ 즉, 로직이 변경되면 모드 중복 코드를 찾아서 일일이 수정해야 함
- 따라서 코드 중복 문제를 해결하기 위해선, 공통 관심사항과 관련된 기능들을 별도의 객체로 분리하고, 분리해낸 객체의 메서드를 통해 공통 관심 사항을 구현한 코드를 실행시킬 수 있어야 함
애플리케이션 전반에 걸쳐 적용되는 공통 기능을 비즈니스 로직으로부터 분리해내는 것을 AOP(Aspect Oriented Programming, 관심 지향 프로그래밍)라고 함
4) PSA (Portable Service Abstraction, 일관된 서비스 추상화)
- 백엔드 개발에 있어서는 데이터베이스를 떼어놓을 수 없음. 데이터베이스와 소통하며 웹 클라이언트의 요청을 수행해야 하기 때문.
- DB 종류는 MySQL, Oracle, Maria DB, Mongo DB 등 다양함
- 만약, MySQL로 개발을 완료했는데 Maria DB로 데이터베이스를 변경해야 할 경우, 기존 작성 코드를 지우고 새로 작성하거나, 기본 DB와 새로운 DB 간에 사용 방법이 다른 코드를 찾아 모두 수정해줘야 함
- 스프링은 동일한 사용 방법을 유지한채로 DB를 바꿀 수 있음! 스프링이 DB 서비스를 추상화한 인터페이스를 제공해주기 때문.
- JDBC(Java DataBase Connectivity): 스프링이 Java를 사용하여 데이터베이스에 접근하는 방법을 규정한 인터페이스
JDBC처럼 특정 기술과 관련된 서비스를 추상화하여 일관된 방식으로 사용될 수 있도록 한 것을 PSA(Portable Service Abstraction, 일관된 서비스 추상화)라고 한다.
스프링 부트(Spring Boot)란?
스프링은 기존 기술 복잡성을 크게 줄인 프레임워크. 하지만, 스프링을 사용하기 위해선 여러 가지 사항을 설정해줘야 함.
아래는 스프링 설정 파일인데 굉장히 복잡하다.
하지만 스프링부트를 사용하면 아래와 같이 간략하게 줄어든다.
즉, 스프링부트는 스프링으로 애플리케이션을 만들 때에 필요한 설정을 간편하게 처리해주는 별도의 프레임워크이다.
⚡스프링(Spring) vs 장고(Django)
✔Django
- 개발자들이 빠르게 개발하기 위해 만들어짐
- 다양한 프로그래밍 작업을 수행하기 위해 바로 사용할 수 있는 구성 요소 제공함 ⇒ 최소한의 노력으로 커스터 마이징 가능
- CRUD, 관리자 인터페이스
- 사용자 인증, RSS 등의 코드를 작성할 필요 없음
- 보안 관점에서 안정적(CSRF, SQL injection)
Django 이점
- 파이썬을 위한 인프라 프레임워크(The Infrastructure Framework for Python): 파이썬으로 작성되었기 때문에, 업무를 능률적으로 처리 가능
- GUI를 통한 관리(Management via Graphical User Interface) : 관리 인터페이스는 몇 줄의 코드만으로 GUI로 구현 가능함
- 확장 가능(Scalable) : 모바일 및 온라인 플랫폼 모두 수백만 명의 사용자를 원활히 사용 가능하게 함
- 사용자 정의 가능(Customizable) : 견고한 프로젝트 틀을 제공하며, 유연성있게 사용자 정의 가능
- 템플릿 시스템 통합(Template System Integration): Django에 내장된 앱 템플릿과 함께 제공됨
- 보안(Security) : SQL injection, XSS, CRSF 공격 및 clickjacking 등 보안에 강함
Django를 활용한 비즈니스
- Pinterest, Mozilla, Instagram, Spotify
✔Spring
- 거대한 생태계
- Java로 엔터프라이즈 애플리케이션 개발을 위한 인프라적 지원 제공
- DJango와 마찬가지로 속도 개발에 중점을 두고 있음
- Java 웹앱 등 기본 라이브러리 및 모듈 제공
Spring Boot 사양
- 관리 지원, YML 지원, 웹 확장 가능, 유형 안전 구형, 보안
Spring Boot 이점
- Time-Saving : YAML 및 자동 설정과 같은 기능이 있어 시간 절약 가능
- 필수 코드 감소 : 반복적인 코드나 복잡한 코드를 제거하여, 개발자 시간 절약
- 일관성 & 원활한 통합 : Spring 생태계의 다른 구성 요소와 통합하는 것이 간단함
- JDBC, ORM, Spring Security
- 플러그인 단순화 : 개발자가 웹애플리케이션을 구축하고 테스트할 때 사용할 수 있는 다양한 외부 플러그인 제공
Spring Boot를 활용한 비지니스
- Udemy, Netflix, Google, Amazon
✔ 비교 1) Learning Curve
Django | Spring |
Python 기반 ⇒ 비즈니스 로직 레이어를 작성할 때 훨씬 이점 | Java 기반 |
스택 개발을 위해 즉시 사용할 수 있는 모든 것을 제공함 (”배터리 포함”프레임워크라고도 함) ⇒ 배우기 쉬움 | 추상적인 구성 요소 제공함 ⇒ 배우기 어려움, |
여러 구성 요소와 라이브러리를 포함해야 하는 대규모 응용프로그램에서 번거로움 | |
“배우기 쉬움” | “배우기 어려움” |
✔ 비교 2) 확장성 및 애플리케이션 성능
Django | Spring |
대규모 응용 프로그램에서 적합하지 않은 것은 아님. | 동시성 및 멀티스레딩에 강함 |
Django가 설계된 방식에 따라 데이터베이스 서버, 애플리케이션 서버 또는 캐싱 서버와 같은 다양한 수준에서 하드웨어를 추가할 수 있음 |
⇒ 애플리케이션이 확장됨에 따라, 분산 컴퓨팅을 위해 여러 서버에서 복잡한 응용 프로그램을 실행할 때 Django에 비해 성능이 좋아짐. |
사용성
DjangoSpring
파이썬 라이브러리로 생산성 높음 | POJO 기반! |
⇒ 특정 인터페이스에 종속되지 않아 테스트를 하기에 용이함 | |
풀스택 프레임워크에서 빛을 발함 |
참고한 사이트:
- 스프링과 스프링부트(Spring Boot)ㅣ정의, 특징, 사용 이유, 생성 방법
- Spring vs Django 비교
- Which Is Better for Your Website: Django or Spring Boot?
Spring을 공부하기 위해 선택한 수업은 "인프런"의 [스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술] 강의이다.
따라서 아래 정리한 내용은 모두 인프런 강의 내용을 토대로 실습한 내용이 주가 될 것이다.
강의 내용
- 스프링 프로젝트 생성
- 스프링 부트로 웹 서버 실행
- 회원 도메인 개발
- 웹 MVC 개발
- DB 연동 -JDBC, JPA, 스프링 데이터 JPA
- 테스트 케이스 작성
강의 목표 : 스프링 학습의 첫 길잡이 역할
- 스프링 기술 그 자체X, 어떻게 사용하느냐를 배움
- 오래된 스프링 기술, 마이너한 기술 X
학습 방법: 처음부터 끝까지 직접 코딩
스프링 로드맵
- 스프링 입문
- 스프링 핵심 원리
- 스프링 웹 MVC
- 스프링 DB 데이터 접근 기술
- 실전! 스프링 부트
1. 프로젝트 환경 설정
프로젝트 생성
라이브러리 살펴보기
View 환경 설정
빌드하고 실행하기
(1) 프로젝트 생성
- Java 11 설치
- IDE : IntelliJ 또는 Eclipse 설치
apt 패키지 인덱스 정보를 아래 명령어로 업데이트하여 자바 리스트를 갱신
sudo apt update
원하는 자바 버전 설치
sudo apt install openjdk-11-jdk
설치 확인
java -version
javac -version
bashrc에 JAVA_HOME을 추가
- export 명령어 사용
- 많은 application(Apache Hadoop 등)은 자바 위치를 찾기위해 JAVA_HOME 변수를 참조. 이에 다른 어플리케이션에서 쉽게 사용할 수 있도록, JAVA_HOME을 설정
sudo vi ~/.bashrc
export JAVA_HOME=$(readlink -f /usr/bin/java | sed "s:bin/java::")
ashrc 변경 사항을 적용하기 위해 아래 명령어를 통해 bashrc를 1회 실행한다.
source ~/.bashrc
IntelliJ IDEA 다운로드 및 설치
이 사이트로 접속한다.(www.jetbrains.com/ko-kr/idea/download/#section=linux)
바로 밑에 있는 Community 버전을 다운로드 받는다.
압축파일을 압축해제 한 후, 아래 명령어를 입력한다.
jihwan@minjeong-desktop:~$ cd Downloads/
jihwan@minjeong-desktop:~/Downloads$ cd ideaIC-2023.1.4/
jihwan@minjeong-desktop:~/Downloads/ideaIC-2023.1.4$ cd idea-IC-231.9225.16/
jihwan@minjeong-desktop:~/Downloads/ideaIC-2023.1.4/idea-IC-231.9225.16$ cd bin/
jihwan@minjeong-desktop:~/Downloads/ideaIC-2023.1.4/idea-IC-231.9225.16/bin$ ./idea.sh
CompileCommand: exclude com/intellij/openapi/vfs/impl/FilePartNodeRoot.trieDescend bool exclude = true
2023-07-25 20:07:11,918 [ 7680] WARN - #c.i.o.v.n.p.l.VfsLog - VFS Log version differs from the implementation version: log null vs implementation -43
2023-07-25 20:07:12,029 [ 7791] WARN - #c.i.o.a.i.ActionManagerImpl - keymap "VSCode" not found PluginDescriptor(name=Terminal, id=org.jetbrains.plugins.terminal, descriptorPath=plugin.xml, path=~/Downloads/ideaIC-2023.1.4/idea-IC-231.9225.16/plugins/terminal, version=231.9225.16, package=null, isBundled=true)
2023-07-25 20:07:12,159 [ 7921] WARN - #c.j.p.PluginClassPathRuntimeCustomizer - There was more than one class loaded in Projector Plugin classloader - this is likely a bug!
2023-07-25 20:07:12,181 [ 7943] WARN - java.util.prefs - Prefs file removed in background /home/jihwan/.java/.userPrefs/prefs.xml
2023-07-25 20:07:12,268 [ 8030] WARN - #c.i.i.ApplicationLoader - Input method disabler: can't parse gsettings line: @a(ss) []
IntelliJ가 실행된다.
참고 블로그
- JAVA 설치 : “Ubuntu 20.04 자바 JDK 설치 및 버전 관리”
- IntelliJ 설치 : [ubuntu] ubuntu 20.04에 IntelliJ IDEA Community 다운 방법 및 순서
스프링 부트 스타터 사이트로 이동해서 스프링 프로젝트 생성
https://start.spring.io
스프링 부트 스타터 : 스프링 프로젝트를 만들어주는 (스프링에서 운영하는 ) 사이트
프로젝트
- Maven Project : 과거에 많이 사용
- Gradle Project : 현재 많이 사용
Language는 자바 선택
Spring Boot에서 버전 선택
- SNAPSHOT: 아직 만드는 중
- M1 : 정식 release된 건 아님
- 2.3.1 설치
Project Metadata
- Group: 기업이름/기업도메인 (우리는 상관없으니까 hello입력)
- Artifact: 빌드되고 난 결과물 (hello spring)
Dependencies (중요)
- 클릭하면 다양한게 나옴우린 웹페이지를 만들거니까, Spring web입력
- tymeleaf : html을 만들어주는 템플릿 엔진 (회사마다 선택하는 엔진 다름)
강의에서 선택한 것
- 프로젝트 선택
- Project: Gradle - Groovy Project
- Spring Boot: 2.3.x
- Language: Java
- Packaging: Jar
- Java: 11
- Project Metadata
- groupId: hello
- artifactId: hello-spring
- Dependencies: Spring Web, Thymeleaf
여기있는 GENERATE 버튼을 누르면 된다!
그러면 zip파일로 만들어진다.
spring 폴더에 넣어주었다.
OPEN 버튼 눌러서 파일을 열어주자
구조
- 빨간 건 무시해도 됨
gradle/lapper
: graddle관련 폴더src : main과 test가 나눠져있음
main
: 이 밑에 java와 resource파일들이 있음test
: test코드들과 관련된 소스들이 들어감. test가 요새 개발 트렌드에서 정말 중요함- java 파일 제외하면 다 resources
build.gradle
src/build.gradle : 중요!
- 옛날에는 다 쳤다고 함.
- 요즘에는 stringboot가 나오면서, 개발자가 편리하도록 해줌
- plugin에 버전과 언어 선택한 내용이 들어감, group, version, sourceCompatibility모두 아까 설정했던대로 잘 들어감
- repositories안에 mavenCentral()은 이 사이트에서 dependencies들을 다운받아옴
- dependencies: thymeleaf, web 등 dependencies선택한 값들이 들어감 (test library는 자동으로 들어감)
- gradle에 대해서는 너무 깊게 할 필요는 없음(물론 하면 좋음)
.gitignore
- 소스코드 관리
- git은 꼭 필요한 소스코드파일만 올라가고, 나머지 build된 결과물 이런 거는 올라가면 안됨
- (이것 때문에 배포할 때 애먹었음)
gradlew, gradlew.bat
- gradle로 빌드한다.
settings.gradle
- 나중에 gradle 배울 때 따로 정리할 예정
(2) 실행
HelloSpringApplication
실행할 땐 메인 메서드를 실행하면 된다. 옆에 실행 버튼이 있다.
근데 어째서 난 에러가 나는 것인가...
에러 해결하고 다시 내용 추가할 예정... 커밍쑨...
'🗃️Backend' 카테고리의 다른 글
[Server] 로드밸런싱 (Load Balancing) 내 맘대로 쉽게 요약 (4) | 2023.08.23 |
---|---|
[대규모서비스] 대규모 트래픽 해결 (1) Scale Up & Scale out (4) | 2023.08.16 |