Spring (4) Annotation, Lombok, Gradle

destro·2025년 4월 29일

2. Spring

목록 보기
4/17
post-thumbnail

1. Framework

📚 소프트웨어 개발을 간편하게 만들기 위한 소프트웨어 개발 환경.

  • 장점
    • 개발 프로젝트에 일관된 구조 제공 → 코드의 일관성, 가독성 향상 및 팀 협업 편해짐
    • 기본적으로 필요한 기능, 도구 제공 → 핵심 비즈니스 로직에 집중 가능
    • 보안 관련 기능 기본 제공 → 보안 취약점 방지
    • 통합된 테스트 환경, 도구 제공 → 테스트를 쉽게 작성, 실행 가능
    • 인기 있는 프레임워크는 방대한 커뮤니티 지원을 받으며, 다양한 문서 활용 가능
  • 단점
    • 복잡한 구조 때문에 처음 익히는 데 많은 시간 소요
    • 프레임워크의 새로운 버전이 기존 코드와 호환되지 않을 수 있음
    • 정해진 규칙과 구조를 따르도록 강제 → 자유로운 변경 어려움

2. Library

📚 애플리케이션 개발에 필요한 클래스, 함수 등을 모은 코드의 모음.

  • 장점
    • 복잡한 코드를 개발자가 직접 작성하지 않음 → 개발 생산성 향상
    • 검증된 라이브러리는 테스트와 커뮤니티 지원을 통해 안정성과 품질 보장
  • 단점
    • 라이브러리 업데이트 및 지원 중단시 문제 발생 가능
    • 버전 호환성 문제로 인해 다른 라이브러리나 기존 코드와 충돌 발생 가능
    • 불필요한 기능을 포함한 라이브러리 사용 → 비효율적
    • 내부 구현을 직접 수정하기 어려움 → 특정 요구 사항에 맞는 조정이 힘듬

3. Annotation

📚 코드에 메타데이터 추가 기능 제공. 프로그램에게 정보를 전달하는 목적
코드에 특별한 의미부여 및 컴파일러와 런타임에 특정 동작을 트리거하기 위해 사용

👉 어노테이션은 @ 기호로 시작. 클래스, 메서드, 변수, 매개변수, 패키지 등에 추가 가능

📌 내장 어노테이션

  • @Override
    • 메서드가 상위 클래스나 인터페이스의 메서드를 오버라이드하고 있음을 나타냄
    • 이때 컴파일러는 메서드가 실제로 오버라이드하고 있는지 확인함
  • @Deprecated
    • 해당 요소가 더 이상 사용되지 않음을 나타냄
    • 해당 어노테이션이 붙은 코드를 사용하면 컴파일 경고 발생
  • @SuppressWarnings
    • 컴파일러 경고 억제. 사용되지 않는 변수에 대한 경고 무시 가능

📌 사용자 정의 어노테이션

  • 개발자가 필요에 따라 직접 어노테이션 정의 가능
  • 특정 메타데이터를 추가하거나, AOP(Aspect-Oriented Programming)와 결합하여 다양한 기능 구현

4. Lombok

📚 보일러 플레이트 코드를 줄여주는 라이브러리.
보일러 플레이트 코드 자동생성 → 가독성, 유지보수성 향상
어노테이션 기반으로 동작, 주로 컴파일 시점에 소스 코드를 변환하여 필요한 메서드를 자동생성

❓ 보일러 플레이트 코드(Boilerplate code) : 생성자, getter/setter, toString메서드 처럼 반복작성되는 코드

📌 주요 Lombok Annotation

  • @Getter, @Setter

    • 클래스의 모든 필드에 대한 getter / setter 메서드 자동생성

      @Getter
      @Setter
      public class User {
          private String name;
          private int age;
      
        /** 아래 코드를 @Getter, @Setter 어노테이션이 생성
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public int getAge() {
              return age;
          }
      
          public void setAge(int age) {
              this.age = age;
          }
          **/
      }
  • @ToString

    • 객체를 String으로 변환해주는 역할. 객체의 toString() 메서드 자동생성
    • 기본적으로 클래스의 모든 필드 포함. 특정 필드 제외 및 포맷 지정 가능
      @ToString
      public class User {
          private String name;
          private int age;
      }
  • @EqualsAndHashCode

    • equals()hashCode() 메서드 자동생성
    • 객체의 동일성과 해시 코드를 정의하는데 사용
      @EqualsAndHashCode
      public class User {
          private String name;
          private int age;
      }
  • @NoArgsConstructor, @AllArgsConstructor, @RequiredArgsConstructor

    • 기본 생성자 생성. 모든 필드를 매개변수로 하는 생성자를 생성.
    • 필수(final) 필드만을 매개변수로 하는 생성자를 자동생성
      @NoArgsConstructor
      @AllArgsConstructor
      public class User {
          private String name;
          private int age;
      }
  • @Data

    • @Getter @Setter @ToString @EqualsAndHashCode @RequiredArgsConstructor 동시 적용
    • 주로 테스트 용도로 사용
      @Data
      public class User {
          private String name;
          private int age;
      }
  • @Builder

    • 빌더 패턴을 적용해 객체를 생성 가능하게 함. 복잡한 객체 생성에 유용.
    • 필드 이름을 명시적으로 지정하면서 객체 생성 가능
      @Builder
      public class User {
          private String name;
          private int age;
      }
    • 사용 예시
      User user = User.builder()
                      .name("John")
                      .age(30)
                      .build();
  • @Slf4j

    • 클래스에 로그를 남기기 위한 Logger 객체 자동생성
      @Slf4j
      public class UserService {
          public void logMessage() {
              log.info("This is a log message");
          }
      }

5. Spring Framework

📚 Java Application Framework로 엔터프라이즈 애플리케이션 개발에 주로 사용

  • 등장 배경
    • 대형 쇼핑몰 시스템(엔터프라이즈 애플리케이션)
      • 수백만 명의 고객이 동시에 상품을 검색하고, 장바구니에 담고, 결제를 시도
      • 많은 사용자의 요청을 한꺼번에 처리하므로 서버의 성능, 신뢰성, 보안 매우 중요
      • 이런 요소들을 고려하지 않고 비즈니스 로직 개발에만 집중하는 것이 필요해짐
      • Spring Framework는 서버 성능, 안정성, 보안 문제를 고도화된 수준으로 해결
  • 특징
    • 애플리케이션의 다양한 구성 요소를 유연하게 연결 및 관리. 누구나 사용할 수 있는 오픈소스
    • 모듈화되어 필요에 따라 특정 기능만 선택사용 가능
    • Java의 가장 큰 특징인 객체 지향의 특징을 살려낸 프레임워크
      캡슐화 상속 추상화 다형성

6. Spring Boot

📚 Spring Framework를 기반으로 신속,간편하게 애플리케이션을 개발하도록 도와주는 도구

  • 등장 배경
    • 스프링 프레임워크는 초기 설정과 구성 파일이 복잡하고 방대함
    • 스프링 애플리케이션을 개발, 배포하려면 여러 가지 의존성 관리 및 서버 설정 필요
    • 최소한의 노력으로 스프링 애플리케이션을 쉽게 개발하고 배포할 수 있는 방법이 필요해짐
  • 특징
    • 자동 구성(Auto-configuration) : 복잡한 설정을 직접 처리하지 않고도 비즈니스 로직에 집중가능
    • 내장 WAS(Tomcat) 제공 → 애플리케이션을 별도의 서버 설정 없이 바로 실행 가능
    • spring-boot-starter-web빌드 관리 도구에 추가시 필요한 모든 종속성과 설정 자동구성
    • 라이브러리 버전을 명시하지 않아도 호환 가능한 버전들을 찾아 자동으로 설정 100%는 아님

7. Gradle

📚 Java와 유사한 문법 구조를 가진 Groovy기반의 스크립트 언어를 사용하며 다양한 소프트웨어를 빌드(Build)할 수 있는 유연한 빌드 자동화 도구.

  • 빌드(Build) : 소스 코드를 컴퓨터가 실행 가능한 파일로 변환해주는 작업

  • 빌드에 필요한 과정

  • 빌드 자동화 도구 : 빌드, 라이브러리 관리, 테스트, 배포 등을 자동화 하여 수행

📌 Gradle 특징

  1. 유연성

    • 복잡한 빌드 시나리오를 처리할 수 있는 유연한 시스템 제공
    • 빌드 스크립트를 통해 다양한 빌드 작업 정의. 필요한 경우 커스터마이징 가능
  2. 성능

    • Build Cache
      • 빌드 결과물을 캐싱하여 재사용. 라이브러리 의존성을 캐싱하여 재사용.
    • 점진적 빌드
      • 마지막 빌드 호출 이후 변경된 부분만 빌드. 미변경 부분은 캐시 결과를 검색해 재사용
    • 데몬 프로세스
      • 다음 빌드 작업을 위해 백그라운드에서 대기하는 프로세스
      • 초기 빌드 이후부터는 빌드 실행 시 초기화 작업을 거치지 않음
  3. 멀티 프로젝트 빌드 지원

    • 공통 클래스를 모듈로 만들어 독립적인 각 프로젝트에서 사용 가능하게 함

  4. 설정 주입 방식

    • 필요한 설정을 직접 프로젝트에 주입. 공통되는 정보는 묶어서 한번에 주입 가능
    • 프로젝트별로 설정을 다르게 주입 가능

8. build.gradle

📚 Groovy 기반 빌드 스크립트. 스크립트를 작성하면 소스 코드를 빌드하고, 라이브러리 의존성 관리 가능

  • build.gradle 전체 구조
  1. 플러그인 : 특정 작업을 위해 모아 놓은 task들의 모음집
    plugins {
        id 'java'
        id 'org.springframework.boot' version '3.1.5'
        id 'io.spring.dependency-management' version '1.1.3'
    }
    • java plugin : 아래 task들이 추가되어 실행 가능
  1. 의존성 관리 : 프로젝트에서 사용하는 라이브러리나 패키지 관리

    dependencies {
        // JPA
        implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    
        // SECURITY
        implementation 'org.springframework.boot:spring-boot-starter-security'
    
        // WEB
        implementation 'org.springframework.boot:spring-boot-starter-web'
    
        // LOMBOK
        compileOnly 'org.projectlombok:lombok'
        annotationProcessor 'org.projectlombok:lombok'
    
        // MySQL
        runtimeOnly 'com.mysql:mysql-connector-j'
    
        // Validation
        implementation 'org.springframework.boot:spring-boot-starter-validation'
    
        // JWT
        compileOnly group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
        runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-impl', version: '0.11.5'
        runtimeOnly group: 'io.jsonwebtoken', name: 'jjwt-jackson', version: '0.11.5'
    
        // DEV_TOOL
        developmentOnly 'org.springframework.boot:spring-boot-devtools'
    
        // TEST
        testRuntimeOnly 'com.h2database:h2'
        testCompileOnly 'org.projectlombok:lombok'
        testCompileOnly group: 'io.jsonwebtoken', name: 'jjwt-api', version: '0.11.5'
        testImplementation 'org.springframework.boot:spring-boot-starter-test'
        testImplementation 'org.springframework.security:spring-security-test'
    }
    • 의존성 설정
      • 라이브러리 추가 시점 설정 가능
      • Implementation : 컴파일, 런타임 시점 모두에서 사용
      • compileOnly : 컴파일할 때만 사용. 런타임 때는 사용하지 않음
      • runtimeOnly : 런타임 때만 사용
      • testImplementation : 테스트할 때만 사용
  2. repositories : 라이브러리가 저장된 위치를 정의하고 저장소에서 라이브러리를 가져옴

    repositories {
        mavenCentral()
    }

    💡 참고 : MavenCentral Repository


9. Java 웹 기술의 역사

📚 서블릿과 JSP로 시작 → MVC 패턴 → MVC 프레임워크로 구조화 → 어노테이션 기반의 Spring MVC → 비동기 처리에 최적화된 Spring WebFlux로 발전

  1. Servlet의 등장 (1997)
    • Java를 사용한 웹 개발의 시초. 서버에서 동적 콘텐츠 생성을 위해 사용.
      클라이언트의 요청을 받고, 응답을 생성하는 기본적인 구조 제공
    • 단점 : 코드의 복잡성 증가, 유지보수가 어려워짐
  1. JSP (JavaServer Pages) 도입 (1999)
    • HTML 내에 Java 코드를 삽입하는 기술. 웹 페이지를 더 쉽게 동적으로 생성하도록 해줌
    • 단점 : JSP 내에 비즈니스 로직 분리 불가능
  1. Servlet, JSP 기반의 MVC 패턴 도입
    • MVC 패턴 도입으로 UI, 비지니스 로직, 데이터를 분리하여 개발하는 방식 등장.
    • Servlet은 주로 컨트롤러(비지니스 로직)로 사용. JSP는 뷰(UI)를 담당.
    • 장점 : MVC 패턴은 웹 애플리케이션의 유지보수성과 확장성 크게 향상
    • 단점 : 개발자가 중복적으로 설정해줘야 하는 부분들이 다수 발생
  1. MVC 프레임워크의 등장과 발전 (2000~2010)
    • Struts, Spring 등의 MVC 프레임워크 등장. 웹 개발이 더욱 구조화되고 효율적으로 변함
    • Spring MVC는 단순하고 강력한 기능 제공 → Java 웹 개발의 표준이 됨
    • 중복적으로 설정해야 하는 부분들을 프레임워크로 자동화
    • 단점 : 여전히 애플리케이션 개발 관련 설정이 복잡함
  1. Annotation 기반의 Spring MVC(2007~현재)
    • Annotation을 통해 애플리케이션 설정의 복잡함을 줄여줌
    • 장점 : 더 직관적이고 간결한 방식으로 웹 애플리케이션을 개발하게 됨
  1. Spring Boot의 등장(2014~현재)
    • Spring 프레임워크를 쉽게 사용하도록 만든 도구. 복잡한 초기 설정 작업 자동화
    • 내장 Tomcat 보유
    • 장점 : 개발자들이 빠르게 애플리케이션을 개발하도록 해줌

최신 기술 동향

  1. Web Servlet : Spring MVC
    • 안정적이고 동기식 프로그래밍 모델을 기반으로 한 웹 애플리케이션 개발에 널리 사용
  2. Web Reactive : Spring WebFlux
    • 비동기, 넌블로킹 모델 기반 웹 프레임워크. 높은 동시성을 요구하는 애플리케이션에서 효율적인 성능 제공. 함수형 프로그래밍 스타일 지원. 서블릿 대신 Netty 등의 비동기 서버 사용
    • 서블릿을 사용하지 않으며, 실시간 데이터처리 및 높은 동시성을 요구하는 애플리케이션에 적합
    • RDBMS 지원 부족, 높은 기술적 난이도로 인해 아직 MVC 모델을 실무에서 더 많이 사용
profile
<포르투갈어> 솜씨 있는. 재간 있는. 능란한. 기민한. (재주가) 비상한.

0개의 댓글