JAVA Spring # 1

keymu·2024년 11월 7일
0

Spring has come for Java Developers

스프링은 순수 객체 지향 언어의 강력한 특징을 살려내는 프레임워크다.
프레임워크는 제어의 역전(IOC=Inversion Of Control) 개념이 적용되어야 한다. 라이브러리 형태로 적용되나, 동작 방식이 좀 다르다.

Spring Boot

여전히 입문자들에게는 Spring은 겨울이었다. 서버 세팅, JSP 세팅 등 개발을 위해 할 게 너무 많았다. 그래서 만들어진 Spring Boot,

번잡한 설정을 줄이자.

스프링부트는 가동하게 되면 Tomcat이라는 server가 가동이 되고, starter dependency가 기본적으로 세팅되어있다.
또한, 더이상 XML이 꼭 필요하진 않게 만들어준다.

스프링 부트는 스프링 프레임워크 기반 위에 돌아간다. 세팅이 기본적으로 되어있어 좀 더 간단할 뿐이다.

Build

  • 프로젝트 생성
  • 라이브버리 설정
  • 코드 작업
  • 컴파일
  • 테스트
  • 패키지
  • 배포
  • 레포팅(문서)

이 모든 걸 합쳐서 빌드, 라고 하고, 이를 효율적으로 개발할 수 있게 해주는 것이 빌드툴.
자바의 빌드툴로는 메이븐, Gradle 등이 있다.

이클립스, 인텔리제이는 IDE다. 빌드툴보다도 편집기, 디버깅, 협업 등 더 많은 기능이 있는 Integrated Development Environment다.

근데 인텔리제이에서 만든 빌드툴이 다른 IDE에서 안 돌아갈 수도 있다. Maven, Gradle에서 만들면 어떤 개발환경이어도 작업할 수가 있다.

Spring Boot는 Maven, Gradle을 기본적으로 지원한다.

빌드툴의 생산성

  • 외부 라이브러리에 대한 의존성을 체크해준다.

Maven: 빌드하는데 꽤 많은 시간이 걸린다. 하나만 수정해도 처음부터 끝까지 다 컴파일함.
Gradle: 변경된 내역만 추적해서 빌드해줌 (대형 프로젝트이며, 잦은 변경이 있을 시 사용)

Gradle이 꼬일 때

  • Gradle -> Reload
  • File -> Invalidate Caches / Restart
  • dependecy가 깨져있는 경우: {Home}/.graddle/caches/ 모두 삭제 후, IntelliJ 재시작
  • SDK 설정 확인
  • Build -> Rebuild Project

스프링의 특징 : DI(Dependency Injection)

Main Class를 한 줄도 바꾸지 않고도 새로운 메세지 객체를 받아 동작하는 것이 가능하다. 의존하는 객체를 Spring Container가 자동 주입해주고 있는 것이다. 그래서 이 걸 사용한다. 직접 Main Class 아무것도 바꾸지 않아도 새로운 메세지 객체(Bean)를 받아 동작한다.

특정 타입의 Bean을 주입할 땐 하나의 Bean이 있어야 한다.
Bean의 이름을 특별히 지정해주지 않았을 땐, class의 이름을 사용해 그 이름이 설정된다.


@Configuration과 @Bean의 동작 방식

@Configuration과 @Bean을 사용하면 Spring이 자동으로 Bean을 생성하고 관리하여 의존성 주입을 할 수 있게 해준다.

  1. Spring 컨테이너 시작
SpringApplication.run(DIMain03.class, args);
  • Spring 애플리케이션이 시작되면 @Configuration이 붙은 클래스를 찾아 Spring 컨테이너가 Bean으로 관리할 객체들을 설정한다.
  1. Bean 정의
@Configuration
public class Config03 {
    @Bean
    public Score score1() {
        return new Score(100, 80, 75, "Good job!");
    }

    @Bean
    public Student stu1() {
        return new Student("Donghee", 34, score1());
    }
}
  • @Bean이 붙은 메서드는 Spring 컨테이너가 관리하는 Bean으로 등록된다.
    메서드 이름이 Bean 이름이 되며, Spring이 이를 통해 Bean을 생성하고 필요한 곳에 자동으로 주입한다.
  1. Bean 주입 및 관리
@Autowired
Score scoreA;   // Config03에서 생성된 "score1" Bean이 주입됨
@Autowired
Student stuA;   // Config03에서 생성된 "stu1" Bean이 주입됨
  • @Autowired로 선언된 필드에는 Spring이 @Bean으로 등록된 Bean을 자동으로 주입한다.
    이 때 score1() 메서드는 딱 한 번 호출되어 하나의 Score Bean만 생성된다.
    이 Bean은 stu1()에서도 사용되며, scoreA와 stuA.getScore()가 동일한 객체를 참조하게 된다.

주요 특징

  • Bean의 싱글톤 관리: Spring은 기본적으로 @Bean으로 등록된 객체를 한 번만 생성하고, 여러 곳에서 재사용한다. 이를 통해 자원을 절약하고 일관성을 유지한다.
  • Bean 이름 지정: @Bean 메서드의 이름이 Bean 이름이 되며, 필요시 @Bean(name = "customName")으로 이름을 지정할 수 있다.
  • 의존성 관리: Student 객체를 생성할 때 score1()을 호출해도 새로운 객체를 생성하지 않고, 이미 생성된 Score Bean을 참조한다.
    이 방식 덕분에 코드가 간결해지고 관리가 쉬워진다. 객체의 생성과 의존성을 Spring이 알아서 관리해주기 때문에, 개발자는 필요한 Bean을 선언하고 주입받기만 하면 된다.
profile
Junior Backend Developer

0개의 댓글