본문 바로가기
  • Hi Hello, Code
🗃️Backend

[Spring] 0. About Spring + 1. 프로젝트 환경설정 (ing)

by 밍구링구링 2023. 7. 25.

 

갑자기 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만 사용하여 만든 객체

출처 :  https://www.codestates.com/blog/content/스프링-스프링부트

 

POJO가 중요한 이유

  • 외부 라이브러리 사용한 경우
    • 해당 기술을 사용하고 있는 모든 객체들의 코드를 전부 바꿔주어야 함
    • 해당 객체는 외부 모듈에 의존하고 있기 때문에 자연스럽게 발생하는 문제임.
  • POJO를 사용한 경우
    • 특정 기술이나 환경에 종속되지 않음
    • ⇒ 외부 기술이나 규약의 변화에 얽매이지 않아 보다 유연하게 변화와 확장에 대처할 수 있음
    • ⇒ 객체지향 설계를 제한없이 적용 가능, 코드가 단순해져 테스트 및 디버깅이 쉬워짐

아래 IoC/DI, AOP, PSA는 모두 POJO 프로그래밍을 위해 스프링이 지원하는 기술이다. 찬찬히 살펴보자

출처 :  https://www.codestates.com/blog/content/스프링-스프링부트

 

2) IoC / DI (Inversion of Control / Dependency Injection, 제어의 역전 / 의존성 주입)

출처 :  https://www.codestates.com/blog/content/스프링-스프링부트

  • 위 코드는 “A가 B에 의존하는 관계”이다. 이는 개발자에 의해 만들어짐.
  • 하지만 여기서, A가 사용할 객체가 B가 아니라, 새롭게 C를 정의해서 사용하고자 한다면? A코드를 변경해야 한다.

출처 :  https://www.codestates.com/blog/content/스프링-스프링부트

  • 위 코드처럼 변경해야 함. 하지만 만약 기존에 V를 사용하던 객체가 A뿐만 아니라 수십 또는 수백개가 있다면 모든 객체의 코드를 수정해야 함

출처 :  https://www.codestates.com/blog/content/스프링-스프링부트

  • 반면에 이 코드는 자신이 사용할 객체를 스스로 생성하지 않고, 생성자를 통해서 외부로부터 받아오고 있다. 여기서 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. 커피 주문 애플리케이션 - 메뉴 등록하기, 주문하기, 주문 변경하기 등
  • 공통 관심사항: 모든 핵심 관심 사항에 공통적으로 적용되는 관심 사항을 의미
    • 모든 핵심 관심사항은 로깅이나 보안 등과 관련된 기능들이 공통적으로 적용되어야 함

출처 :  https://www.codestates.com/blog/content/스프링-스프링부트

  • 이때, 핵심 관심 사항과 공통 관심 사항이 위와 같이 코드에 함께 모여있으면 공통 관심사항과 관련된 코드가 중복될 수밖에 없음 ⇒ 즉, 로직이 변경되면 모드 중복 코드를 찾아서 일일이 수정해야 함
  • 따라서 코드 중복 문제를 해결하기 위해선, 공통 관심사항과 관련된 기능들을 별도의 객체로 분리하고, 분리해낸 객체의 메서드를 통해 공통 관심 사항을 구현한 코드를 실행시킬 수 있어야 함

애플리케이션 전반에 걸쳐 적용되는 공통 기능을 비즈니스 로직으로부터 분리해내는 것을 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)란?

스프링은 기존 기술 복잡성을 크게 줄인 프레임워크. 하지만, 스프링을 사용하기 위해선 여러 가지 사항을 설정해줘야 함.

출처 :  https://www.codestates.com/blog/content/스프링-스프링부트

아래는 스프링 설정 파일인데 굉장히 복잡하다.

출처 :  https://www.codestates.com/blog/content/스프링-스프링부트

하지만 스프링부트를 사용하면 아래와 같이 간략하게 줄어든다.

출처 :  https://www.codestates.com/blog/content/스프링-스프링부트

즉, 스프링부트는 스프링으로 애플리케이션을 만들 때에 필요한 설정을 간편하게 처리해주는 별도의 프레임워크이다.


⚡스프링(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을 공부하기 위해 선택한 수업은 "인프런"의 [스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술] 강의이다.

 

[무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의

스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확인해주세

www.inflearn.com

따라서 아래 정리한 내용은 모두 인프런 강의 내용을 토대로 실습한 내용이 주가 될 것이다.

 

강의 내용

  • 스프링 프로젝트 생성
  • 스프링 부트로 웹 서버 실행
  • 회원 도메인 개발
  • 웹 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)

 

최고의 Java 및 Kotlin IDE인 IntelliJ IDEA를 다운로드하세요

 

www.jetbrains.com

바로 밑에 있는 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가 실행된다.

참고 블로그


스프링 부트 스타터 사이트로 이동해서 스프링 프로젝트 생성
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

실행할 땐 메인 메서드를 실행하면 된다. 옆에 실행 버튼이 있다.

근데 어째서 난 에러가 나는 것인가...

에러 해결하고 다시 내용 추가할 예정... 커밍쑨...

반응형