스프링은 왜 쓰라고 하는 거죠?

yboy·2022년 5월 17일
0

Learning Log 

목록 보기
5/41
post-thumbnail

학습동기

우아한테크코스 레벨2 두 번째 미션(지하철 노선도)에서 스프링을 사용하지 않은 프로그램에서 스프링을 이용한 프로그램으로 바꿔 보는 기회를 가지게 됐다. 이 과정에서 스프링을 사용하지 않았을 때와 스프링을 사용할 때의 차이점이 뭔지에 대해 생각해 보게 되었다.

학습내용

Spring이란?

우선 spring이 뭔지에 대해 한 번 짚고 가보자.

자바 플랫폼을 위한 오픈소스 애플리케이션 프레임뭐크로서 엔터프라이즈급 애플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량하된 솔루션이다

사전적 의미는 다음과 같다.

그래서 왜 스프링을 써야 되는데?
순수 자바로 잘만 프로그래밍하고 있는데 우테코는 갑자기 이걸 쓰라고 하는 거야?

내가 생각한 결론은 다음과 같다.

IOC (Inversion of Control)

IOC란 제어의 역전이란 뜻이다. 말이 너무 거창해 보이는데 쉽게 말하면,
우리는 평소
1. 객체를 생성하고
2. 객체의 역할에 따라 필요한 행위를 만들어 주고
3. 이 객체가 필요한 객체에 직접 의존성을 주입해 준다.

위 플로우로 프로그래밍을 해왔다.

근데 위 과정을 개발자가 아니라 다른 대상이(여기서는 스프링)이 해주는 것이 IOC이다.
IOC에서 객체는 자기가 사용할 객체를 선택하거나 생성하지 않는다. 또한 자신이 어디서 만들어지고 어떻게 사용되는지 또한 모른다. 즉, 자신의 모든 권한을 다른 대상에게 맡기는 것이다. 스프링에서는 스프링 컨테이너가 등록된 빈의 모든 것을 관리해준다.

그래서 관리를 해줘서 왜 좋았는데?

Spring을 사용하지 않았을 때는 static메서드를 사용해 객체들을 관리해 줘야 했었다. static을 사용하는 것과 스프링 빈을 사용하는 것에는 공통점이 있는데

  • 싱글톤으로 관리된다. (new 키워드를 통해 객체를 생성하지 않아도 된다.)

같은 공통점을 가지는데 어떻게 다름을 느꼈을까?
우선 장점으로는

  1. @controller, @service, @repository 등의 어노테이션을 달아놓으면 코드를 읽을 때 해당 클래스가 어떤 역할을 하는지 한 눈에 파악하기 쉽다.
    -> 이 장점에 대해 생각하면서 @controller, @service, @repository와 @Component와의 차이점에 대해 조사해보았다. 근데 @Controller가 @RequestMapping을 사용 할 수 있다는 점 외애는 나머지에서는 차이점을 찾지 못했다.(현재로서는) 그렇기 때문에 다음과 같은 layer를 분리해주는 가독성적인 면에서의 장점을 위한 annotaion들인가? 라는 생각을 하게 됐다.

  2. @jdbcTest, @RestController, @controller 등의 어노테이션을 사용하지 않았을 때는 위의 어노테이션들이 제공해주는 기능을 코드로 직접 짜야 한다.
    예를 들어 @controller는 @GetMapping, @PostMapping등의 기능을 제공해주어 어노테이션을 사용하지 않았을 때 보다 코드가 깔끔해진다는 것을 느꼈다.

@RequestMapping 적용 전

public static void main(String[] args) {
        port(8080);
        staticFiles.location("/static");
        
              post("/move", (req, res) -> {
            try {
                MoveDto moveDto = gson.fromJson(req.body(), MoveDto.class);
                return gson.toJson(chessGameService.move(moveDto.getFrom(), moveDto.getTo()));
            } catch (Exception e) {
                return gson.toJson(new ErrorDto(e.getMessage()));
            }
        });

@RequestMapping 적용 후

@PostMapping
public ResponEntitiy<MoveResponseDto> move(@RequestBody MoveRequestDto moveRequestDto) {
	MoveResponseDto moveResponseDto = chessGameService.move(moveRequestDto)
    return ResponseEntity.ok().body(moveResponseDto);
}

마무리

아직 스프링에 대해 많이 몰라서 더욱 더 스프링 공부를 열심히 해야 겠다고 느꼈다. 앞으로 내부 동작, 주요 개념들을 많이 공부해 스프링의 이점과 스프링의 활용해 멋있는 프로그래머가 되고 싶다.

1개의 댓글

comment-user-thumbnail
2022년 5월 18일

같이 스프링 공부 합시다

답글 달기