• Spring과 Spring Boot는 모두 스프링 프레임 워크를 기반으로 한 자바 웹 개발 프레임워크이다.

 

Spring

  • Spring은 스프링 프레임워크의 핵심 모듈을 모아서 만든 프레임워크이다.
  • Spring은 개발자가 직접 설정 파일을 작성하여
    스프링 컨테이너를 구성하고, 필요한 빈 객체를 등록하고, 빈 객체 간의 의존성을 설정해야 한다.
  • Spring은 특정한 구성을 위해 추가적인 라이브러리와 설정이 필요하다.

Spring Boot

  • Spring Boot는 스프링 프레임 워크를 보다 쉽게 사용할 수 있도록 만든 프레임 워크이다.
  • Spring Boot에서는 개발자가 설정 파일을 작성할 필요 없이, 프로젝트의 설정과 라이브러리 의존성을 자동으로 처리해주는 기능을 제공한다. 
  • Spring Boot에서는 실행 가능한 JAR 파일을 만들 수 있다.
  • Spring Boot는 Spring에서 제공하는 여러 기능들을 자동으로 설정하여 개발자가 보다 쉽게 사용할 수 있도록 해준다.
    • Spring Boot는 Spring MVC, Spring Data JPA, Spring Security 등의 기능을 자동으로 설정하여 개발자가 별도로 설정 파일을 관리하지 않아도 사용할 수 있다.
    • Spring Boot는 Actuator라는 모니터링과 관리를 위한 기능을 제공하여, 애플리케이션의 상태를 모니터링하고, 필요한 조치를 취할 수 있도록 해준다.

 

Spring은 스프링 프레임워크를 보다 세밀하게 제어하고자 하는 경우에,
Spring Boot는 빠르게 간단하게 스프링 애플리케이션을 개발하고자 하는 경우에 
사용된다.

 

 

spring 과 springBoot의 차이점 - 고승조님의 블로그 - 인프런 | 커뮤니티

spring 과 springBoot의 차이점 - Spring과 Spring Boot는 모두 스프링 프레임워크를 기반으로 한 자바 웹 개발 프레임워크입니다. 둘 간에는 몇 가지 차이점이 있습니다.Spring은 스프링 프레임워크의 핵심

www.inflearn.com

'Spring Boot' 카테고리의 다른 글

ORM(Object Relational Mapping) - JPA와 MyBatis 차이  (0) 2024.01.27
String to Enum  (1) 2024.01.14
Fegin  (1) 2024.01.10
자주 사용하는 Lombok 어노테이션  (1) 2024.01.08

ORM (Object Relational Mapping) 이란?

  • 객체와 DB의 테이블을 Mapping 시켜 RDB 테이블을 객체지향적으로 사용하게 해주는 기술
  • 객체와 RDB를 별개로 설계하고 중간에서 ORM이 매핑해주는 역할을 한다.
  • 즉, ORM은 SQL문이 아닌 RDB의 데이터 그 자체와 매핑하기 때문에 SQL을 직접 작성하지 않는다.
  • RDB 테이블은 객체지향적 특징 (상속, 다형성, 레퍼런스) 등이 없어서 Java와 같은 객체 지향적 언어로의 접근이 쉽지 않지만, 이럴때 ORM을 사용하면 보다 객체 지향적으로 RDB를 사용할 수 있다.
  • Java에서 사용하는 대표적인 ORM으로는 JPA와 그의 구현체인 Hibernate가 있다. (JPA가 등장하기 전에는 MyBatis라는 Object Mapping 기술을 이용했었다. MyBatis는 Java 클래스 코드와 직접 작성한 SQL 코드를 매핑시켜주어야 한다.)
  • 따라서 JPA라는 ORM 기술에 의해 DB에서 조회된 데이터들이 객체로 연결되어 있고, 객체의 값을 수정하는 것은 DB의 값을 수정하는 것이라고 할 수 있다. 

JPA (ORM)

  • 자바 ORM의 기술 표준
  • 대표적인 오픈 소스 Hibernate
  • CRUD 메소드 기본 제공
  • 쿼리를 만들지 않아도 됨
  • 1차 캐싱, 쓰기 지연, 변경감지, 지연로딩 제공
  • MyBatis는 쿼리가 수정되어 데이터 정보가 바뀌면 그에 사용되고 있던 DTO와 함께 수정해주어야 하는 반면에,
    JPA는 객체만 바꾸면 된다.
  • 즉, 객체 중심으로 개발 가능
  • 하지만, 복잡한 쿼리는 해결이 어렵다.

MyBatis (SQL Mapper)

  • 자바에서 SQL Mapper를 지원해주는 프레임워크
  • SQL문을 이용해서 RDB 접근, 데이터를 객체화 시켜줌
  • SQL을 직접 작성하여 쿼리 수행 결과를 객체와 매핑
  • 쿼리문을 xml로 분리 가능
  • 복잡한 쿼리문 작성 가능
  • 데이터 캐싱 기능으로 성능 향상
  • 하지만, 객체와 쿼리문을 모두 관리해야 한다. CRUB 메소드를 직접 다 구현해야 함.

ORM과 SQL Mapper 비교

ORM  SQL Mapper
- Object와 DB 테이블을 매핑하여 데이터를 객체화하는 기술
-> 개발자가 반복적인 SQL을 직접 작성하지 않음
-> DBMS에 종속적이지 않음
-> 복잡한 쿼리의 경우, JPQL을 사용하거나 SQL Mapper을 혼용하여 사용 가능
- Object와 SQL의 필드를 매핑하여 데이터를 객체화하는 기술
-> 객체와 테이블 간의 관계를 매핑하는 것이 아님
-> SQL문을 직접 작성하고 쿼리 수행 결과를 어떠한 객체에 매핑할지 바인딩 하는 방법
-> DBMS에 종속적인 문제
-> ex) JDBCTemplate, MyBatis

 

 

ORM의 개념, JPA와 MyBatis 차이

데이터들이 프로그램이 종료되어도 사라지지 않고 어떤 곳에 저장되는 개념을 영속성(Persistence) 이라고 한다.자바에서는 데이터의 영속성을 위한 JDBC를 지원해주는데, 이는 매핑 작업을 개발자

velog.io

 

'Spring Boot' 카테고리의 다른 글

Spring 과 Spring Boot의 차이  (2) 2024.01.27
String to Enum  (1) 2024.01.14
Fegin  (1) 2024.01.10
자주 사용하는 Lombok 어노테이션  (1) 2024.01.08
public enum UserType {
    KAKAO, GOOGLE, NAVER;
}
UserType userType = UserType.valueOf("KAKAO");

 

'Spring Boot' 카테고리의 다른 글

Spring 과 Spring Boot의 차이  (2) 2024.01.27
ORM(Object Relational Mapping) - JPA와 MyBatis 차이  (0) 2024.01.27
Fegin  (1) 2024.01.10
자주 사용하는 Lombok 어노테이션  (1) 2024.01.08

Fegin이란?

  • Fegin은 Netflix에서 개발된 선언적인 HTTP Client 도구로서, 외부 API 호출을 쉽게할 수 있도록 도와준다.
  • '선언적인' 이란 어노테이션 사용을 의미한다. Fegin은 인터페이스에 어노테이션들만 붙여주면 구현이 된다.
  • 이러한 방식은 Spring Data JPA와 유사하며, 상당히 편리하게 개발할 수 있도록 도와준다.
    • Spring Data JPA를 사용하는 것처럼,
      추상화를 통해 구현체를 작성하지 않고 Interface만 작성하면 자동으로 구현된다.
    • RestTemplate보다 훨씬 간결하다. (RestTemplate은 대체되고 있기 때문에 주의해서 사용해야 한다.
    • 가장 큰 장점은 작성할 코드가 줄어든다는 것이다.

RestTemplate vs. Fegin

  •  환율 조회 API를 RestTemplate으로 작성한 것
@Component
@RequiredArgsConstructor
class ExchangeRateRestTemplate {

    private final RestTemplate restTemplate;
    private final ExchangeRateProperties properties;
    private static final String API_KEY = "apikey";

    public ExchangeRateResponse call(final Currency source, final Currency target) {
        return restTemplate.exchange(
                        createApiUri(source, target),
                        HttpMethod.GET,
                        new HttpEntity<>(createHttpHeaders()),
                        ExchangeRateResponse.class)
                .getBody();
    }

    private String createApiUri(final Currency source, final Currency target) {
        return UriComponentsBuilder.fromHttpUrl(properties.getUri())
                .queryParam("source", source.name())
                .queryParam("currencies", target.name())
                .encode()
                .toUriString();
    }

    private HttpHeaders createHttpHeaders() {
        final HttpHeaders headers = new HttpHeaders();
        headers.add(API_KEY, properties.getKey());
        return headers;
    }
}

출처: https://mangkyu.tistory.com/278 [MangKyu's Diary:티스토리]
  • 요즘 같이 API 호출이 잦은 MSA의 시대에서 이런 코드를 반복한다는 것은 번거롭다..!

 

  • 환율 조회 API를 Fegin으로 작성한 것
@FeignClient(name = "ExchangeRateOpenFeign", url = "${exchange.currency.api.uri}")
public interface ExchangeRateOpenFeign {

    @GetMapping
    ExchangeRateResponse call(
            @RequestHeader String apiKey,
            @RequestParam Currency source,
            @RequestParam Currency currencies);

}
출처: https://mangkyu.tistory.com/278 [MangKyu's Diary:티스토리]
  • 생산성이 굉장히 높은 코드다

Fegin의 단점 및 한계

  • HTTP Client가 HTTP2를 지원하지 않는다.
    • HTTP Client에 대한 추가 설정 필요
  • 공식적으로 Reactive 모델을 지원하지 않는다.
    • 비공식 오픈소스 라이브러리로 사용 가능
  • 경우에 따라서 애플리케이션이 뜰 때, 초기화 에러가 발생할 수 있다
    • Object Provider로 대응 필요
  • 테스트 도구를 제공하지 않는다.
    • 별도의 설정 파일을 작성하여 대응 필요

[Feign 구현하기]

의존성 추가하기

  • Fegin은 Spring Cloud 기반의 기술이므로, Spring Cloud에 대한 의존성이 필요하다. Spring Cloud 문서를 보면 현재의 Spring Boot 버전에 맞는 버전이 명시되어 있다.

https://github.com/spring-cloud/spring-cloud-release/wiki/Spring-Cloud-2021.0-Release-Notes

 

  • 필자는 Spring Boot 버전이 2.7.13이어서 Spring Cloud Netflix 버전을 3.1.7로 맞췄다.
ext {
    set('springCloudVersion', "2021.0.4")
}

dependencyManagement {
    imports {
        mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
    }
}
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign:3.1.7'

Main

@EnableFeignClients
@SpringBootApplication
public class FeignTest {

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

@EnableFeignClients

  • @EnableFeignClients는 @SpringBootApplication 하위 경로에 선언한다.
  • @EnableFeignClients는 하위 경로의 @FeignClient를 Scan한다.

 

public interface TestClient

@FeginClient(value = "test1", url = "http://localhost:8080")
public interface TestClient {
	
    @GetMapping("/testget/get/{string}")
    String testGetFeign(@PathVariable("string") String string);
    
}

@FeignClient

  • value : FeignClient의 서비스 이름으로, 필수 속성이다. BeanName과는 다르다.
  • url : 해당 interface의 baseUrl이다.
    • Class 레벨에서 @RestMapping으로 Handler들을 묶어주는 것과 비슷하다. 
  • configuration : 관련 커스터마이징 Configuration을 설정할 수 있다.
  • qualifier : 추가 구분자를 설정해준다.
  • fallback : Hystrix fallback 메서드이다.

 

 

'Spring Boot' 카테고리의 다른 글

Spring 과 Spring Boot의 차이  (2) 2024.01.27
ORM(Object Relational Mapping) - JPA와 MyBatis 차이  (0) 2024.01.27
String to Enum  (1) 2024.01.14
자주 사용하는 Lombok 어노테이션  (1) 2024.01.08

접근자/설정자 자동 생성

@Getter 
@Setter

 

생성자 자동 생성

@NoArgsConstructor //파라미터 없는 기본 생성자
@AllArgsConstructor //모든 필드 값을 파라미터로 받는 생성자
@RequiredArgsConstructor //final이나 notnull인 필드 값만 파라미터로 받는 생성자

 

ToString 메소드 자동 생성

@ToString(exclude="password")

 

equals, hashCode 자동 생성

@EqualAndHashCode(callSuper=true) // 자바 빈을 만들 때 자주 오버라이딩하는 equals와 hashCode

//+ callSuper 속성을 통해 메소드 자동 생성 시 부모 클래스의 필드까지 감안할지 안 할지 설정

 

@Builder.default

빌더로 인스턴스 생성 시 초기화할 값을 정할 수 있다. 빌더 패턴을 쓰는 데 필드에 객체타입이 있다면 꼭 써주자.

'Spring Boot' 카테고리의 다른 글

Spring 과 Spring Boot의 차이  (2) 2024.01.27
ORM(Object Relational Mapping) - JPA와 MyBatis 차이  (0) 2024.01.27
String to Enum  (1) 2024.01.14
Fegin  (1) 2024.01.10

+ Recent posts