국비학원 39일차 : Spring Boot

Digeut·2023년 4월 19일
0

국비학원

목록 보기
33/44

Web Server

Static Resource. 클라이언트의 HTTP 요청을 받아들이고, HTTP 응답을 반환하는 소프트웨어입니다. 웹 서버는 정적 파일(HTML, 이미지, CSS 등)을 제공하는 것 외에도, 동적 콘텐츠(웹 페이지, API 응답 등)을 생성하기 위한 웹 어플리케이션 서버와 연동될 수 있습니다.

JavaScript 라이브러리인 React로 가동시켜봄

웹 서버 소프트웨어 : Apache, Nginx, IIS, Node, python

Web Application Server

동적 콘텐츠를 생성하고, 처리하기 위한 소프트웨어입니다. 웹 어플리케이션 서버는 클라이언트의 HTTP 요청을 받아들이고, 애플리케이션 로직을 처리한 후, HTTP 응답을 반환합니다. 일반적으로, 웹 어플리케이션 서버는 서버 측 스크립트 언어(Java, Python, Ruby 등)와 프레임워크(Spring, Django, nodExpress, flask, Ruby on Rails 등)를 사용하여 동적 콘텐츠를 생성합니다. 입력하는것에 따라서 하나의 리소스에 대해서 다른 결과를 내뱉어줍니다.

웹 어플리케이션 서버 소프트웨어 : Tomcat, JBoss, WebSphere, WebLogic, Node

Data Base Server

데이터를 저장하고 관리하기 위한 소프트웨어입니다.(RDBMS, DBMS) 웹 어플리케이션에서는 데이터베이스 서버를 사용하여 데이터를 저장, 조회, 수정, 삭제 등을 할 수 있습니다. 대표적인 데이터베이스 서버로는 MySQL, PostgreSQL, Oracle, SQL Server 등이 있습니다.

웹 서버, 웹 어플리케이션 서버, 데이터베이스 서버는 모두 독립적으로 설치 및 운영이 가능하지만, 대규모 웹 어플리케이션의 경우 이들을 함께 사용하여 웹 서비스를 제공하는 경우가 많습니다. 이 때, 웹 서버와 웹 어플리케이션 서버 사이에서는 특정 프로토콜(HTTP, AJP 등)을 사용하여 통신하고, 웹 어플리케이션 서버와 데이터베이스 서버 사이에서는 JDBC, ORM 등의 기술을 사용하여 데이터를 처리합니다.

Spring Boot (프레임워크)

제어의 역전(IoC)과 의존성 주입(DI)

제어의 역전(Inversion of Control, IoC)은 소프트웨어 개발에서 중요한 개념 중 하나입니다. 기존에는 개발자가 코드의 제어 흐름을 직접 제어하였지만, IoC는 이를 반대로 전환하여 제어 흐름을 프레임워크 또는 라이브러리가 담당하도록 합니다.

일반적으로 객체 지향 프로그래밍에서는 객체 간의 관계를 설정하고 의존성을 주입하는 등의 작업을 개발자가 직접 수행합니다. 하지만 IoC는 이를 역전시켜 객체 간의 관계와 의존성을 외부에서 관리하고, 개발자는 이를 활용하여 비즈니스 로직에 집중할 수 있습니다.

IoC를 구현하기 위해 DI(Dependency Injection, 의존성 주입)가 사용됩니다. DI는 객체가 사용하는 의존성을 객체 외부에서 주입하는 것으로, 객체 생성 시점에 외부에서 의존성을 주입하여 객체 간의 결합도를 낮추고 유지보수성을 높일 수 있습니다.

Spring 프레임워크에서는 IoC와 DI가 핵심 개념 중 하나입니다. Spring은 애플리케이션 컨텍스트에서 객체 생성 및 의존성 주입을 처리하므로 개발자가 직접 객체 생성 및 의존성 주입을 수행하지 않아도 됩니다. 이를 통해 개발자는 비즈니스 로직 구현에 집중할 수 있으며, 유지보수성과 생산성을 높일 수 있습니다.

의존성 주입 3가지 ❔다시정리 필요❔

1. 생성자 주입

생성자 주입은 의존성을 객체 생성 시점에 주입하는 방법입니다. 객체가 생성될 때 생성자를 통해 외부에서 주입된 의존성을 받아 사용합니다. 이 방법은 객체 생성 시점에 모든 의존성을 주입받기 때문에 객체 생성 후에는 의존성을 변경할 수 없습니다.

public class Example {
    private Dependency dependency;
    
    public Example(Dependency dependency) {
        this.dependency = dependency;
    }
}

2. 세터 주입

세터 주입은 의존성을 객체 생성 후에 주입하는 방법입니다. 객체 생성 시점에는 의존성이 없지만, 생성된 객체에게 세터 메서드를 통해 외부에서 의존성을 주입할 수 있습니다. 이 방법은 객체 생성 후에 의존성을 변경할 수 있기 때문에 유연성이 높습니다.

public class Example {
    private Dependency dependency;
    
    public void setDependency(Dependency dependency) {
        this.dependency = dependency;
    }
}

3. 필드 객체 선언을 통한 주입

필드 객체 선언은 의존성을 객체 필드에 직접 선언하여 주입하는 방법입니다. 이 방법은 객체 생성 시점에 모든 의존성을 주입받기 때문에 객체 생성 후에는 의존성을 변경할 수 없습니다.

public class Example {
    @Autowired
    private Dependency dependency;
}

Spring 프레임워크에서는 생성자 주입과 세터 주입을 모두 지원하며, 필드 객체 선언은 스프링의 어노테이션(@Autowired)을 통해 구현할 수 있습니다. 각각의 방법에 대한 장단점이 있으므로 상황에 맞게 적절한 방법을 선택하여 사용해야 합니다.

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


A B C를 핵심기능이라 할 때, 그 사이사이 부가기능으로 S1,2가 들어가는 경우 S를 각각 구현을 해야한다. 이때 미리 S를 만들어두고 사이사이에 호출을 하면 된다.

AOP 관점에서는 부가 기능은 핵심 기능이 어떤 기능인지에 무관하게 로직이 수행되기 전 또는 후에 수행되기만 하면 된다. 여러 비즈니스 로직에서 반복되는 부가 기능을 하나의 공통 로직으로 처리하도록 모듈화해 삽입하는 방식을 AOP라고 한다. → 그냥 함수화 해서 우리가 필요한 시점에서 호출을 하는것

AOP는 관점을 기준으로 묶어 개발하는 방식을 의미한다. 관점이란 어떤 기능을 구현할 때 그 기능을 ‘핵심 기능’과 ‘부가 기능’으로 구분해 각각을 하나의 관점으로 보는 것을 의미한다.

‘핵심 기능’은 비즈니스 로직을 구현하는 과정에서 비즈니스 로직이 처리하려는 목적 기능을 말한다. 하지만 실제 애플리케이션을 개발할 때는 핵심 기능에 ‘부가 기능’을 추가할 상황이 생긴다. 로그 처리 및 트랜잭션 처리 등이 이에 해당한다.

AOP 관점에서는 부가 기능은 핵심 기능이 어떤 기능인지에 무관하게 로직이 수행되기 전 또는 후에 수행되기만 하면 된다.

스프링 AOP의 목적은 OOP와 마찬가지로 모듈화해서 재사용 가능한 구성을 만드는 것이고, 모듈화된 객체를 편하게 적용할 수 있게 함으로써 개발자가 비즈니스 로직을 구현하는 데만 집중할 수 있게 도와주는 것이다.

레이어드 아키텍처

애플리케이션의 컴포넌트를 유사 관심사를 기준으로 레이어로 묶어 수평적으로 구성한 구조를 의미한다.

프레젠테이션 계층
상황에 따라 유저 인터페이스 계층이라고도 한다. 클라이언트와의 접점이 된다. 클라이언트로부터 데이터와 함께 요청을 받고 처리 결과를 응답으로 전달하는 역할이다.

사용자와 소프트웨어 시스템 사이의 인터페이스를 담당하는 계층입. 주로 웹 인터페이스나 모바일 앱과 같은 사용자 인터페이스를 담당.

Controller가 수행한다.

비즈니스 계층
상황에 따라 서비스 계층이라고도 한다. 핵심 비즈니스 계층이라고도 한다.
트랜잭션 처리나 유효성 검사 등의 작업도 수행한다.

비즈니스 로직을 처리하는 계층. 이 계층은 프레젠테이션 계층과 데이터 액세스 계층 사이에서 중개자 역할을 한다.

Service가 수행한다.

데이터 접근 계층
상황에 따라 영속(Persistence) 계층이라고도 한다. 데이터베이스에 접근해야 하는 작업을 수행한다.

데이터베이스나 파일 시스템 등의 데이터 저장소와 직접적인 연결을 담당하는 계층. 이 계층은 데이터의 영속성을 관리한다.

Repository가 수행한다.

Spring Boot 환경설정

Visual Studio Code - java Coding Pack 설치

Visual Studio Code - Spring Boot Extension Pack 설치


Gradle은 Java 기반의 프로젝트 빌드 시스템으로, 프로젝트의 컴파일, 테스트, 라이브러리 관리, 배포 등을 자동화하기 위해 사용됩니다. Gradle은 간단한 빌드 스크립트를 통해 이러한 작업을 수행하며, 이를 통해 프로젝트 개발 및 유지보수의 효율성을 높일 수 있습니다.

Gradle은 Maven과 같은 다른 Java 빌드 도구와 비교하여 더욱 유연하며, 빠르고 효율적인 빌드를 지원합니다. 또한 Gradle은 Groovy를 기반으로 하므로, 동적인 빌드 구성이 가능하며, 빌드 스크립트 작성에 있어서 높은 가독성을 제공합니다.

따라서, Java 기반의 프로젝트를 개발할 때 Gradle을 사용하면, 더욱 빠르고 효율적인 빌드 프로세스를 구축할 수 있으며, 유지보수 및 확장성 측면에서도 매우 유용합니다.

Lombok Annotations Support for VS Code는 자바 개발 도구인 Lombok의 애노테이션을 사용하기 쉽게 지원해주는 Visual Studio Code 확장 프로그램입니다.

Lombok은 자바 언어에서 코드의 반복 작성을 줄여주는 기능을 제공하는 라이브러리입니다. 이 라이브러리를 사용하면 코드의 가독성을 높일 수 있으며, 개발자는 불필요한 코드 작성으로 인한 시간 낭비를 줄일 수 있습니다.

Lombok Annotations Support for VS Code는 이러한 Lombok 라이브러리의 애노테이션을 VS Code에서 지원해주기 때문에, 개발자들은 보다 간편하게 Lombok 라이브러리를 사용할 수 있습니다. 이 확장 프로그램을 설치하면, Lombok 애노테이션에 대한 자동 완성 기능과 함께, 코드 편집기에서 Lombok 애노테이션을 쉽게 사용할 수 있습니다. 이를 통해 개발자는 더욱 효율적으로 코드를 작성할 수 있습니다.


Spring Boot Snippets는 스프링 부트 프레임워크를 사용하는 개발자들이 코드 작성을 더욱 간단하게 할 수 있도록 지원해주는 Visual Studio Code 확장 프로그램입니다.

이 확장 프로그램을 설치하면, 스프링 부트 애플리케이션 개발 시 자주 사용하는 코드 조각들을 쉽게 입력할 수 있으며, 이를 통해 개발자는 코드 작성 시간을 단축할 수 있습니다. 예를 들어, st를 입력하면 @SpringBootApplication 어노테이션이 자동으로 생성되는 등의 기능을 제공합니다. Spring Boot Snippets를 사용하면 스프링 부트 프레임워크를 보다 더 효율적으로 사용할 수 있습니다.

최종 설치 앱들



Spring Boot 프로젝트 생성

  1. VS Code에서 새창을 띄운 후 F1을 누른다
  2. 열린 팔레트에 Spring initializr을 입력한다
    확장에서 Spring initializr이 있기때문에 가능하다.
  3. version을 2.7.10을 선택한다 (안정적인 버전이다)
  4. 개발시 사용할 언어를 java로 선택한다
  5. com(회사이름).이름을 입력한다
  6. 프로젝트의 이름을 입력한다.
  7. packaging 유형을 jar로 선택한다
  8. 사용할 java 버전을 17로 선택한다
  9. 외부주입 의존을 지정한다
  10. 생성할 폴더를 지정한다

생성된 프로젝트 폴더

firstproject에 만들어진 폴더, 클래스

controller

@RestController
public class MainController {
    
    private final MainService mainService;

    @Autowired //IOC를 적용할수 있다.
    public MainController(MainService mainService){
        this.mainService = mainService;
    }

    @GetMapping("/hello")
    public String hello(){
        return mainService.hello();
    }
    //http로 hello 메서드를 호출하고 싶다면
	//(프로그램은 접속을 할수 없음) @GetMapping("/hello")

}

PostMan 적용화면

repository

service

public ⭐interface MainService {
    public String hello();
}

service.serviecimplements

@Component //지정해둔 클래스에만 Ioc 시킬수 있고 
//Autowired로 가져올수 있게 된다 
//@service 해도 이름을 지정해준거지 컴포넌트의 역할을 한다
public class MainServeceImplement implements MainService {

    @Override
    public String hello() {
        return "Hello";
    }
    //메인 서비스 구현하도록 해줌
}

MainService 인터페이스를 구현한 구현체입니다. 즉, MainService 인터페이스에서 선언된 메소드들을 실제로 구현하는 클래스입니다. MainService 인터페이스에 선언된 메소드들을 구현하여, 실제로 데이터베이스에서 데이터를 조회하거나, 데이터를 가공하는 등의 작업을 수행합니다.

MainServeceImplement 의존성 주입을 받아서 사용하는 경우가 많습니다. 예를 들어, 데이터베이스 연결을 위한 DataSource 객체나, 데이터베이스 쿼리를 처리하기 위한 JdbcTemplate 객체 등이 MainServeceImplement 생성자를 통해 주입될 수 있습니다. 이렇게 주입된 객체들을 활용하여 MainServeceImplement은 비즈니스 로직을 수행하게 됩니다.

FirstprojectApplication

@SpringBootApplication
public class FirstprojectApplication {

	public static void main(String[] args) {
		SpringApplication.run(FirstprojectApplication.class, args);
	}

}

PostMan

API 테스트를 위해 사용한다.

Postman은 API 개발 및 테스트를 위한 협업 플랫폼으로, RESTful API를 테스트하고 개발하기 위한 강력한 기능을 제공합니다. Postman을 사용하면 다음과 같은 이점이 있습니다.

빠른 API 테스트: Postman을 사용하면 빠르게 API 요청을 테스트하고 디버깅할 수 있습니다. 각 API 요청의 응답 코드 및 응답 시간 등을 쉽게 확인할 수 있습니다.
API 문서화: Postman을 사용하면 API를 문서화할 수 있습니다. API 요청 및 응답 데이터를 문서화하여 API 사용자들이 이해하기 쉽도록 만들 수 있습니다.
협업: Postman은 API 개발 및 테스트를 위한 협업 기능을 제공합니다. 팀원들과 API 요청 및 응답 데이터를 공유하고, 테스트 결과를 공유할 수 있습니다.
컬렉션 관리: Postman을 사용하면 API 요청 및 응답 데이터를 컬렉션으로 관리할 수 있습니다. 이를 통해 API 요청 및 응답 데이터를 보다 체계적으로 관리할 수 있습니다.
확장성: Postman은 다양한 플러그인을 지원합니다. 이를 통해 API 개발 및 테스트를 보다 확장성 있게 할 수 있습니다.

profile
개발자가 될 거야!

0개의 댓글