Skip to content
l22hm edited this page May 14, 2024 · 6 revisions

Spring 개론

▶️ 개념 정리

절차적 프로그래밍 vs 객체지향 프로그래밍

☑️ 절차적 프로그래밍(Procedural Programming) :

프로그램을 일련의 절차나 함수의 집합으로 보고, 데이터와 프로시저(함수)를 별도로 놓고 프로그램을 순차적으로 실행하는 방식

🔴 특징

순차적 실행 : 프로그램이 위에서 아래로 순차적으로 실행되며, 특정 작업을 수행하는 데 필요한 코드를 함수로 구분하여 사용

모듈화: 프로그램을 작은 단위의 함수로 나누어 관리할 수 있어, 코드의 재사용성과 관리가 용이

🔴 단점

대규모 프로젝트에서 코드의 유지보수가 어렵고, 데이터와 함수가 분리되어 있어 프로그램의 복잡도가 증가할 수 있음

☑️ 객체지향 프로그래밍(Object-Oriented Programming, OOP) :

프로그램을 객체의 집합으로 보고, 데이터와 그 데이터를 처리하는 함수(메서드)를 하나의 단위(객체)로 묶어서 관리하는 방식

🔴 특징

캡슐화 : 데이터와 함수를 하나의 객체로 묶어서 외부의 접근을 제한하고, 객체 간의 상호작용을 통해 프로그램을 구성

상속 : 한 클래스의 특성을 다른 클래스가 물려받을 수 있어, 코드의 재사용성을 높이고 유지보수를 용이하게 함

다형성: 같은 이름의 메서드가 다른 기능을 수행할 수 있게 하여, 프로그램의 유연성을 증가시킴

🔴  단점

설계 시 많은 노력이 필요하며, 실행 속도가 절차적 프로그래밍에 비해 느릴 수 있음

☑️ 자바(Java)

자바는 객체지향 프로그래밍 언어로, 다양한 플랫폼에서 실행될 수 있음

🔴 특징

플랫폼 독립성 : 자바 가상 머신(JVM) 위에서 실행되므로, 한 번 작성하면 어디서든 실행될 수 있음

객체지향 프로그래밍 지원 : 클래스와 객체를 기반으로 프로그래밍을 할 수 있어 코드의 재사용성과 유지보수성이 높음

풍부한 API 지원 : 표준 라이브러리가 풍부하여 다양한 기능을 쉽게 구현할 수 있음

스프링(Spring Framework)과 스프링 부트(Spring Boot)

☑️ Spring Framework

자바를 기반으로 하는 엔터프라이즈급 애플리케이션을 개발하기 위한 경량화된 프레임워크로 의존성 주입(Dependency Injection)과 같은 제어 역전(IoC) 원칙을 사용하여 애플리케이션의 결합도를 낮추고, 개발의 효율성을 높임

🔴 특징

경량 컨테이너로서의 역할: 애플리케이션의 객체 생성, 생명 주기 관리 등을 담당

의존성 주입 지원: 객체 간의 의존성을 외부에서 주입해주어, 결합도를 낮추고 유연한 코드를 작성할 수 있게 함

다양한 프로그래밍 모델 지원: MVC 웹 애플리케이션 개발부터 메시지 기반의 애플리케이션 개발까지 다양한 프로그래밍 모델을 지원

☑️ Spring Boot

스프링부트는 스프링을 기반으로 하여, 빠르고 쉽게 프로덕션급의 스프링 기반 애플리케이션을 개발할 수 있도록 도와주는 도구

 ****

🔴 특징 image

자동 설정 : @EnableAutoConfiguration 어노테이션을 통해 스프링 애플리케이션의 많은 부분을 자동으로 설정가능

내장 서버 : 내장된 Tomcat, Jetty 등의 웹 서버를 사용하여 별도의 웹 서버 설치 없이 애플리케이션을 실행할 수 있음

스타터 패키지 : 스프링부트 스타터(Starter) 의존성을 통해 필요한 라이브러리를 쉽게 추가하고 관리할 수 있음

✅ 클래스와 객체

클래스(Class) : 객체를 정의하는 틀 또는 설계도

****객체의 상태를 나타내는 **필드(변수)**와 객체의 행동을 나타내는 **메소드(함수)**로 구성

객체(Object) : 실제 프로그램에서 사용되는 데이터와 그 데이터와 관련된 동작들의 집합

클래스의 인스턴스라고도 함

✅ 생성자(Constructor) :

클래스로부터 객체를 생성할 때 호출되는 특별한 메소드

객체의 초기화를 담당하며, 클래스 이름과 동일하고 반환 타입을 정의하지 않음

✅ 상속(Inheritance) :

한 클래스가 다른 클래스의 속성(필드)과 기능(메소드)을 물려받는 것을 의미

코드의 재사용성을 높이고, 중복을 줄이는 데 도움을 줌

✅ Getter와 Setter

Getter : 객체의 특정 필드 값을 읽는 메소드

필드의 접근 제어자가 private인 경우, 외부에서 직접 접근할 수 없으므로 public Getter 메소드를 통해 간접적으로 필드 값을 얻을 수 있음

Setter: 객체의 특정 필드 값을 설정하는 메소드

필드가 private으로 설정되어 외부에서 직접 접근할 수 없을 때, public Setter 메소드를 통해 필드의 값을 설정할 수 있음

▶️ SOLID 원칙

  • 객체지향 설계의 다섯 가지 기본 원칙으로, 유지보수와 확장이 용이한 소프트웨어 시스템을 만들기 위한 지침

🔴 SRP (Single Responsibility Principle) : 단일 책임 원칙

한 클래스는 하나의 책임만 가져야 함

🔴 OCP (Open/Closed Principle) : 개방-폐쇄 원칙

소프트웨어 요소는 확장에는 열려 있어야 하지만, 변경에는 닫혀 있어야 함

🔴 LSP (Liskov Substitution Principle) : 리스코프 치환 원칙

서브 타입은 언제나 기반 타입으로 교체할 수 있어야 함

🔴 ISP (Interface Segregation Principle) : 인터페이스 분리 원칙

클라이언트는 자신이 사용하지 않는 인터페이스에 의존하면 안 됨

🔴 DIP (Dependency Inversion Principle) : 의존성 역전 원칙

고수준 모듈은 저수준 모듈에 의존하면 안 되며, 둘 다 추상화에 의존해야 함

✅ 의의 : SOLID 원칙을 이해하고 적용하면 더욱 견고하고 유지보수가 쉬운 코드를 작성할 수 있음

▶️ MVC 패턴 (Model & View & Controller)

🔴 모델(Model) :

****애플리케이션의 데이터와 비즈니스 로직을 관리하며 데이터베이스, 초기화된 데이터, 변수 등을 포함하여 애플리케이션의 상태를 나타냄

역할 :

데이터 저장 및 관리

비즈니스 로직 처리 (예: 계산, 데이터 검증 등)

데이터 변경 시, 뷰와 컨트롤러에 변경 사항 알림

🔴 뷰(View) :

****사용자에게 정보를 표시하는 방법을 정의한다. 모델을 사용하여 사용자 인터페이스를 생성하며, 사용자의 입력을 컨트롤러로 전달

역할 :

사용자 인터페이스(UI) 표시

사용자 입력 받기

모델로부터 데이터를 받아 사용자에게 보여줌

🔴 컨트롤러(Controller) :

사용자의 입력을 받아 모델과 뷰를 업데이트한다. 컨트롤러는 사용자의 입력을 처리하고, 모델을 업데이트한 후, 적절한 뷰를 사용자에게 제공함

역할 :

****사용자의 입력 처리

모델 상태 변경

뷰에게 모델의 변경 사항을 알려주어 업데이트하도록 함

✅ MVC 패턴의 장점

  1. 분리된 역할 : MVC 패턴은 애플리케이션의 구조를 명확하게 분리하여, 개발과 유지보수가 용이함

  2. 재사용성 및 확장성 : 각 구성 요소는 독립적으로 개발되어 재사용성과 확장성이 높음

  3. 유연한 UI 변경: 뷰를 변경해도 모델에 영향을 주지 않으므로, 사용자 인터페이스를 유연하게 변경할 수 있음

 실습([Spring MVC Best Practices](https://medium.com/@bubu.tripathy/spring-mvc-best-practices-427fbd11e1f8)) : 스프링 MVC를 사용하는 베스트 프랙티스와 코드 예시를 제공

▶️ IoC와 DI

  • IoC(제어의 역전) : 객체의 생성부터 생명주기 관리까지 개발자가 아닌 스프링 컨테이너가 담당함. 이를 통해 개발자는 비즈니스 로직에 더 집중할 수 있으며, 코드의 결합도를 낮출 수 있음

  • DI(의존성 주입) : IoC의 한 형태로, 객체 간의 의존 관계를 외부에서 주입해주는 방식임. 이를 통해 유연하고 확장성 있는 코드를 작성할 수 있으며, 테스트와 유지보수가 용이해짐

https://velog.io/@mayhan/%EC%9D%98%EC%A1%B4%EC%84%B1Dependency%EA%B3%BC-%EC%9D%98%EC%A1%B4%EC%84%B1-%EC%A3%BC%EC%9E%85DI

▶️ 스프링 빈

  • 스프링 컨테이너에 의해 관리되는 객체

  • 생명주기는 스프링 컨테이너에 의해 관리됨

  • 개발자는 스프링 빈의 생성, 사용, 소멸에 대한 제어를 스프링 컨테이너에 위임

  • 스프링 빈을 사용함으로써 애플리케이션의 설정과 의존성 관리가 용이해짐

▶️ AOP(관점 지향 프로그래밍)

  • 횡당 관심사(Cross-cutting Concerms)를 모듈화하는 프로그래밍 기법
  • 로깅, 트랜잭션 관리 등 여러 모듈에서 공통적으로 사용하는 기능을 AOP를 통해 관리할 수 있음

✅ AOP의 주요 용어

🔴 Aspect : 횡단 관심사를 모듈화한 코드 조각

🔴 Advice : Aspect의 코드 중에서 언제 (Before, After, Around) 실행될지를 정의함

🔴 Pointcut : Advice가 적용될 Join points(메소드 등)를 지정합니다.

🔴 Target : Advice가 적용되는 대상 객체

✅ AOP의 의의 : 애플리케이션의 여러 부분에서 공통적으로 사용되는 기능의 중복을 제거하여 애플리케이션의 핵심 비즈니스 로직에 집중할 수 있게 도와줌

✅ 실습([Spring Framework Overview](https://docs.spring.io/spring-framework/reference/overview.html)) : AOP를 사용하여 메소드 실행을 관리하는 다양한 방법을 제공

▶️ JDBC와 ORM

  • 자바에서 데이터베이스를 다루는 두 가지 다른 접근 방식

🔴 JDBC:

  • 자바에서 데이터베이스에 접속할 수 있도록 하는 API

  • 개발자가 SQL 쿼리를 직접 작성하고, 데이터베이스 연결, 쿼리 실행 등의 과정을 직접 관리해야 함

  • 세밀한 데이터베이스 제어가 가능하며, SQL쿼리의 최적화가 용이

  • 반복적인 코드 작성이 필요하고, 데이터베이스와의 연결 관리가 복잡할 수 있음

🔴 ORM:

  • 객체와 관계형 데이터베이스의 데이터를 자동으로 매핑해주는 기술

  • 개발자는 객체 지향적인 코드로 데이터를 다룰 수 있으며, ORM 프레임워크가 SQL쿼리를 생성 및 실햄

  • 객체 지향적인 코드로 데이터베이스를 다룰 수 있어 개발 생산성이 높아짐

  • 데이터베이스 변경에 따른 코드 수정이 적음

  • 복잡한 쿼리의 경우 ORM의 자동화된 처리가 비효율적일 수 있음

▶️ JPA와 MyBatis

🔴 JPA(Java Persistence API):

  • 자바 ORM 기술에 대한 API 표준 명세로, 개발자가 객체 지향적으로 데이터를 관리할 수 있게 도와줌

  • Hibernate, EclipseLink 등이 JPA를 구현

  • 데이터베이스 독립적인 프로그래밍이 가능하며, 엔티티 기반의 데이터 접근을 제공

🔴 MyBatis:

  • SQL 매핑 프레임워크로, SQL과 객체 사이의 매핑을 설정함으로써 데이터베이스 작업을 쉽게 할 수 있게 해줌

  • SQL 쿼리에 대한 세밀한 제어가 가능하며, 복잡한 쿼리나 동적 쿼리에 유리함

▶️ 트랜잭션 관리

  • 트랜잭션은 데이터베이스의 상태를 변화시키는 작업의 단위

  • 스프링은 선언적 트랜잭션 관리를 지원하여, 어노테이션을 통해 트랜잭션을 쉽게 관리할 수 있게 해줌

▶️ 스프링 시큐리티

  • 스프링 시큐리티는 애플리케이션의 보안을 위한 인증과 권한 부여를 지원하는 프레임워크

  • 다양한 인증 방식을 지원하며, 세밀한 접근 제어를 가능하게 함

▶️ RESTful API

  • REST 아키텍처 스타일을 따르는 API를 개발할 때 사용

  • 스프링 MVC를 활용하여 RESTful 웹 서비스를 쉽게 구현할 수 있음

▶️ 스프링 데이터 JPA

  • 스프링 데이터 JPA는 JPA를 더 쉽게 사용할 수 있도록 지원하는 모듈

  • 리포지토리 계층의 구현을 최소화하면서 데이터 접근을 용이하게 해줌

▶️ 스프링 클라우드

  • 마이크로서비스 아키텍처를 구축할 때 필요한 여러 패턴을 쉽게 구현할 수 있도록 지원하는 프로젝트 모음

▶️ 스프링 배치

  • 대량의 데이터를 처리하는 배치 애플리케이션을 개발할 때 사용

  • 성능, 로깅, 트랜잭션 관리 등을 지원함


  • 회원 서비스 개발 회원 서비스 구현을 통해 다음과 같은 핵심적인 스프링의 개념과 기술들을 실습하며 익힐 수 있습니다:

스프링 컨테이너와 빈(Bean): 스프링에서 객체(Bean)의 생명주기를 관리하는 방법과, 컨테이너가 어떻게 빈을 관리하는지를 배울 수 있습니다.

의존성 주입(Dependency Injection): 객체 간의 의존성을 스프링 컨테이너를 통해 자동으로 주입하는 방법을 배우며, 이를 통해 느슨한 결합도와 높은 유지보수성을 가진 코드를 작성하는 방법을 익힐 수 있습니다.

스프링 데이터 JPA: 스프링 데이터 JPA를 사용하여 데이터베이스와의 상호작용을 추상화하는 방법을 배우며, 객체 지향적인 데이터 접근을 실습할 수 있습니다.

MVC 패턴: 스프링 MVC를 사용하여 웹 애플리케이션을 구축하는 방법을 배우며, 컨트롤러, 뷰, 모델의 역할과 상호작용을 이해할 수 있습니다.

테스트: 스프링 테스트 프레임워크를 사용하여 단위 테스트와 통합 테스트를 작성하는 방법을 배우며, 테스트 주도 개발(TDD)의 기본을 실습할 수 있습니다.

-다음 차례 홈 화면 추가: 가장 기본이 되는 기능으로, 스프링 MVC를 이해하고, 컨트롤러를 사용해 간단한 홈 화면을 만드는 것부터 시작합니다. 이 과정에서 Thymeleaf 같은 템플릿 엔진을 사용하는 방법도 배울 수 있습니다.

회원 등록: 회원 정보를 입력받고 저장하는 기능을 구현합니다. 이 단계에서는 HTML 폼을 처리하고, 스프링의 데이터 바인딩, 검증 기능을 사용하는 방법을 배웁니다. 또한, 간단한 회원 객체를 메모리에 저장하는 방법부터 시작할 수 있습니다.

회원 조회: 등록된 회원 목록을 화면에 표시하는 기능입니다. 이를 통해 스프링 MVC의 모델-뷰 컨트롤러 패턴을 더 깊이 이해하고, 리스트를 화면에 렌더링하는 방법을 배울 수 있습니다.

게시글 작성: 회원 기능이 어느 정도 구현되면, 게시글을 작성하는 기능을 추가합니다. 이 과정에서는 FORM 데이터를 서버로 전송하고, 이를 처리하여 데이터베이스에 저장하는 과정을 배웁니다.

게시글 조회: 작성된 게시글을 목록 혹은 개별적으로 보여주는 기능을 구현합니다. 여기서는 게시글 데이터를 읽어오고, 페이징 및 검색 같은 추가 기능에 대해서도 고민해볼 수 있습니다.

섹션 4. 스프링 빈과 의존관계

  • 컴포넌트 스캔과 자동 의존관계 설정

  • 자바 코드로 직접 스프링 빈 등록하기

섹션 5. 회원 관리 예제 - 웹 MVC 개발