주니어 기초 코딩공부/Spring 기초

[Spring] 스프링 시작하기- 기초 설명 및 스프링 프로젝트 파일 만들기

jju_developer 2023. 2. 2. 17:37
728x90

안녕하세요 jju_developer입니다.

오늘부터 2주간 스프링에 대해서 배운 부분을 공유드리려고 합니다.

첫 번째 주는 Spring Legacy 두 번째 주는 Spring 부트에 대해서 배울 예정입니다.

1. 스프링(Spring)이란?

Java 개발자들은 Spring을 사용하여 웹 서비스를 만들 수 있습니다. 

Spring의 특징들은 아래와 같습니다.

  • Spring은 자바 객체와 라이브러리들을 관리해주며,
    톰캣과 같은 WAS가 내장되어 있어 자바 웹 어플리케이션을 구동할 수 있습니다.

  • Spring은 경량 컨테이너로 자바 객체를 직접 Spring 안에서 관리합니다.
    객체의 생성 및 소멸과 같은 생명 주기(Life cycle)을 관리하며,
    Spring 컨테이너에서 필요한 객체를 가져와 사용합니다.

  • Spring의 가장 큰 특징으로 IOC와 DI가 많이 언급됩니다.
    IOC와 DI의 간단한 개념은 아래와 같습니다.
    • 제어의 역전 (IOC, Inversion Of Control)
      • 일반적으로 처음에 배우는 자바 프로그램에서는 각 객체들이 프로그램의 흐름을 결정하고
        각 객체를 직접 생성하고 조작하는 작업(객체를 직접 생성하여 메서드 호출)을 했습니다
        .
        즉, 모든 작업을 사용자가 제어하는 구조였습니다.
        예를 들어 A 객체에서 B 객체에 있는 메소드를 사용하고 싶으면,
        B 객체를 직접 A 객체 내에서 생성하고 메소드를 호출합니다.
      • 하지만 IOC가 적용된 경우, 객체의 생성을 특별한 관리 위임 주체에게 맡깁니다. 
        이 경우 사용자는 객체를 직접 생성하지 않고, 객체의 생명주기를 컨트롤하는 주체는 다른 주체가 됩니다.
        즉, 사용자의 제어권을 다른 주체에게 넘기는 것을 IOC(제어의 역전)라고 합니다.
      • 요약하면 Spring의  IOC란 
        클래스 내부의 객체 생성 -> 의존성 객체의 메소드 호출이 아닌, 스프링에게 제어를 위임하여 스프링이 만든 객체를 주입 -> 의존성 객체의 메서드 호출 구조입니다.
        스프링에서는 모든 의존성 객체를 스프링이 실행될때 만들어주고 필요한 곳에 주입해 줍니다.
    • 의존성 주입 (DI, Dependency Injection)
      • 어떤 객체(B)를 사용하는 주체(A)가 객체(B)를 직접 생성하는 게 아니라 
        객체를 외부(Spring)에서 생성해서 사용하려는 주체 객체(A)에 주입시켜 주는 방식입니다.
        사용하는 주체(A)가 사용하려는 객체(B)를 직접 생성하는 경우 의존성(변경사항이 있는 경우 서로에게 영향을 많이 준다)이 높아집니다.
        하지만, 외부(Spring)에서 직접 생성하여 관리하는 경우에는 A와 B의 의존성이 줄어듭니다.

 

 

Spring Framework의 특징

경량 컨테이너로서 자바 객체를 직접 관리합니다.

- Spring은 모든 객체의 생성, 소멸과 같은 라이프 사이클을 관리하며 Spring으로부터 필요한 객체를 얻어올 수 있습니다.

스프링을 정의함에 있어 경량급 애플리케이션 프레임워크라 함은, 스프링을 사용함으로써 기존 기술을 사용할 때에 불가피하게 작성해야만 했던 불필요하게 복잡한 코드를 제거하여 코드의 복잡성을 낮출 수 있음을 의미합니다.

 

Spring은 POJO(Plain Old Java Object) 방식의 프레임워크입니다.

- POJO라는 용어를 처음 보면 어색하고 어려워 보일 수 있는데,

무거운 객체가 아닌, 그냥 아무것도 안 붙인 자바 객체라고 생각하면 됩니다.

 

순수 Java 만을 사용한다는 것은 Java 및 Java의 스펙에 정의된 기술만 사용한다는 의미입니다. 

즉, 어떤 객체가 외부의 라이브러리나 외부의 모듈을 가져와서 사용하고 있다면, 

그 객체는 POJO라고 할 수 없습니다.

POJO는 말 그대로, 다른 기술을 사용하지 않는 순수한 Java만을 사용하여 만든 객체인 것입니다.

그렇다면, POJO는 왜 중요한 것이고, 어떤 이유에서 POJO 프로그래밍이라는 패러다임까지 만들어지게 된 것일까요? 

외부 라이브러리를 import 하여 라이브러리의 메서드를 사용하고 있는 객체가 있다고 가정해 봅시다. 

이 객체는 순수 Java 외에 외부 기술을 사용하고 있으므로, POJO가 아닙니다. 

이때, 이 객체가 사용하고 있는 기술이 Deprecated 되거나, 개선된 신 기술이 등장하여 기존 기술과 관련된 코드를 

모두 고쳐야 하는 상황이 발생하면 해당 기술을 사용하고 있는 모든 객체들의 코드를 전부 바꿔주어야만 합니다

이는 해당 객체가 외부 모듈에 직접적으로 의존하고 있기 때문에 자연스럽게 발생하는 문제입니다.

반면, POJO는 순수 Java만을 사용하여 만든 객체이므로 특정 기술이나 환경에 종속되지 않습니다. 따라서, 외부 기술이나 규약의 변화에 얽매이지 않아, 보다 유연하게 변화와 확장에 대처할 수 있습니다. 이러한 POJO를 사용하여 비즈니스 로직을 구현하면 객체지향 설계를 제한 없이 적용할 수 있으며, 코드가 단순해져 테스트와 디버깅 또한 쉬워집니다. 

이처럼 비즈니스 로직을 구현하는 데에 POJO를 적극적으로 활용하는 프로그래밍 패러다임을 POJO 프로그래밍이라고 합니다.

 

Spring은 애플리케이션 프레임워크입니다.

웹 개발에 있어 프레임워크란, 어떠한 목적을 쉽게 달성할 수 있도록 해당 목적과 관련된 코드의 뼈대를 미리 만들어둔 것을 의미합니다.

애플리케이션 프레임워크는 애플리케이션을 개발하는 데에 있어 필요한 모든 업무 분야 및 모든 기술과 관련된 코드들의 뼈대를 제공합니다.

 

Spring은 IoC(Invesion of Control)를 지원합니다.

- Spring이 컨트롤권을 갖고 있어서 필요에 따라 Spring에서 사용자의 코드를 호출합니다.

 

Spring은 DI(Dependency Injection)를 지원합니다.

- 각각의 계층이나 서비스들 간에 의존성이 존재할 경우 프레임워크가 서로 연결시켜 줍니다.

 

Spring은 AOP(Aspect-Oriented Programming)을 지원합니다

- 트랜잭션, 로깅, 보안처럼 여러 모듈에서 공통적으로 사용되는 기능을 분리하여 관리할 수 있습니다.

발생하는 코드의 중복이라는 문제를 해결하기 위해서는 공통 관심 사항과 관련된 기능들을 별도의 객체로 분리해 낸 

다음, 분리해낸 객체의 메서드를 통해 공통 관심 사항을 구현한 코드를 실행시킬 수 있도록 해야 합니다. 

이처럼, 애플리케이션 전반에 걸쳐 적용되는 공통 기능을 비즈니스 로직으로부터 분리해 내는 것을 AOP(Aspect Oriented Programming, 관심 지향 프로그래밍)라고 합니다.

 

Spring은 영속성과 관련된 다양한 서비스를 지원합니다.

- iBatis, Hibernate 등 이미 완성도가 높은 데이터베이스 처리 라이브러리와 연결할 수 있는 인터페이스를 제공합니다.

 

Spring은 확장성이 높습니다.

- Spring에서 통합하기 위해 기존 라이브러리를 간단하게 감싸는 정도로 Spring에서 사용이 가능하기 때문에

수많은 라이브러리가 지원되고, 별도로 분리하기도 용이합니다.

 

PSA (Portable Service Abstraction, 일관된 서비스 추상화)

스프링은 Java 백엔드 개발에 있어 핵심적인 역할을 수행하는 프레임워크이며, 

백엔드 개발에서 데이터베이스는 떼어놓기 어렵습니다. 

웹 서버는 데이터베이스와 소통하며 웹 클라이언트의 요청을 처리해야 하기 때문입니다. 

데이터베이스의 종류는 MySQL, Oracle, Maria DB, Mongo DB 등 다양합니다.

만약, MySQL을 사용하여 개발을 완료했는데, Maria DB로 데이터베이스를 바꿔야 하는 상황을 가정해 봅시다.

이때, 각 데이터베이스마다 사용 방법이 다르다면 어떨 것 같나요?

아마 기존에 작성한 코드를 전부 지우고 새로 작성해야 하거나,

기존 데이터베이스와 새로운 데이터베이스 간에 사용 방법이 다른 코드를 모두 찾아서 일일이 수정해주어야 할 것입니다.

그러나, 스프링을 사용하면 동일한 사용방법을 유지한 채로 데이터베이스를 바꿀 수 있습니다. 

이는 스프링이 데이터베이스 서비스를 추상화한 인터페이스를 제공해 주기 때문에 가능합니다. 

즉, 스프링은 Java를 사용하여 데이터베이스에 접근하는 방법을 규정한 인터페이스를 제공하고 있으며, 

이를 JDBC(Java DataBase Connectivity)라고 합니다.

각 데이터베이스를 만든 회사들은 자신의 데이터베이스에 접근하는 드라이버를 Java 코드의 형태로 배포하는데, 이 드라이버에 해당하는 Java 코드의 클래스가 JDBC를 구현합니다. 따라서, JDBC를 기반으로 하여 데이터베이스 접근 코드를 작성해 두면, 이후에 데이터베이스를 바꾸어도 기존에 작성한 데이터베이스 접근 로직을 그대로 사용할 수 있습니다.

 

 

2. 스프링(Spring) 프로젝트 파일 생성하기

2-1 스프링의 파일 -> New -> Spring Legacy Project을 생성해 줍니다.

스프링 프로젝트 생성

2-2 프로젝트 이름을 BoardWebLab으로 설정 후 박스 안의 Templates: 'Spring MVC Project'를 선택

스프링 프로젝트 설정


2-3 다운 yes!

스프링 프로젝트 설정

2-4 패키지 이름을 com.springbook.biz로 설정 후 Finish 누르기!

스프링 프로젝트 설정

이 부분은 패키지를 생성하는 것입니다.

 

이렇게 하면 스프링 프로젝트가 생성됩니다.

 

그럼 이렇게 기본이 생깁니다.

해당 프로젝트를 오른쪽 클릭 후 Run As-> Run on Server를 실행하면 Hello world! 가 뜹니다.

 

이렇게 뜨면 정상적으로 실행이 된 것입니다!!

 

 

그럼 지금까지 스프링의 기초에 대해 알아보았습니다.

 

 

 

유용한 공부 링크 : https://programforlife.tistory.com/103

유용한 공부 링크 : https://khj93.tistory.com/entry/Spring-Spring-Framework%EB%9E%80-%EA%B8%B0%EB%B3%B8-%EA%B0%9C%EB%85%90-%ED%95%B5%EC%8B%AC-%EC%A0%95%EB%A6%AC

 

고생하셨습니다.

728x90