• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    미해결

영한님 질문드립니다

22.03.12 16:59 작성 조회수 141

0

안녕하세요 영한님

질문 드리겠습니다

 

스프링 기반에서 유틸성 클래스를 만들때

(1)SomeUtil util = new SomeUtil(); 이런식으로 new 를 사용해 객체를 생성하는 방식

(2)org.apache.commons 의 StringUtils 와 같은 스태틱 메서드로 이루어진 클래스

(3)스프링빈(@Component 등)

위와 같이 세가지 방법으로 생각해볼 수 있을 것 같은데 1, 2, 3 방법을 선택하는 기준이 무엇인지 궁금합니다

 

질문1

(1)번과 (2), (3)번을 구분하는 방법으로는 해당 클래스가 상태를 가져야하는가 라고 있는데 상태를 가져야한다면 (1)번

그렇지 않다면 (2), (3)에서 고민을 한다고 알고 있습니다 이렇게 구분하는게 맞는지 알고 싶습니다

(결정짓는 요소가 상태뿐인건지 아니면 상태가 아니라 다른 여러 요소로 구분하는 것인지 잘 모르겠습니다)

 

질문2

(2), (3) 중에서 선택한다고 할때 이것을 나누는 기준에 대해 알고 싶습니다

https://www.facebook.com/devbeginner/posts/1011209305658104/

 

이 게시물을 보면 http://kwon37xi.egloos.com/4844149 페이지로 연결이 되는데 내용을 읽어보니

facebook 에 타이틀로 되어있는 "Spring Bean과 Static Class는 언제 사용하는거지?" 라는 내용보다는

앞에서 예시를 들었던 (1)번과 (2)번을 나누는 것에 대한 글이라고 느껴졌습니다

static 함수 모음 클래스와 POJO Bean 을 구분하는 내용의 글인데 

POJO Bean 이라는게 정확이 어떤 것인지 잘 모르겠지만 글 내용상으로는 스프링빈을 의미하는 것이 아니라

(1)번처럼 SomeUtil util = new SomeUtil(); 을 의미하는 것 같다고 느껴지는데

타이틀처럼 (2), (3)번을 구분하는 내용으로 받아들여도 되는건지 궁금합니다

(다른 포스팅의 내용에 대해 질문을 드리는게 예의가 아니지만 평소 궁금했던 것에 대한 내용이 많이 포함되어있어 링크를 남겼습니다)

 

질문3

스프링을 사용하면서 제일 중요한 부분이라 느껴져서 

앞서드린 질문과 중복되는 내용의 질문 같지만 따로 구분해서 질문을 드립니다

스프링에서 유틸성 클래스(SMTP, FTP 등의 유틸 클래스)를 만들때 (1), (2), (3) 형식으로 만들 수 있을 것 같은데

이것을 확실히 구분하는 명확한 기준을 잘 모르겠습니다

영한님이 생각하시는 기준은 무엇인지 알고 싶습니다

 

질문과 관련해서 검색을 해보았는데 의외로 관련된 내용을 찾기가 어려워 질문을 드립니다

스프링을 사용하면서 여러 클래스를 생성하게 되는데 이 부분에 대한 이해가 없어서 고민이 될때가 있습니다

(혹시 이런 내용에 대해 언급하신 강의가 있다면 말씀 부탁드리겠습니다)

 

좋은 강의 잘 보고 있습니다

감사합니다

 

답변 1

답변을 작성해보세요.

0

codesweaver님의 프로필

codesweaver

2022.03.16

안녕하세요, lect 님. 공식 서포터즈 codesweaver 입니다.
.

질문1) 질문2)

인스턴스 (new 키워드 사용)로 사용하는 클래스는 아시다시피 프로세스 중 1회성으로 사용하고 버리는 객체등에 많이 사용합니다. DTO에 값을 담아 다른 객체로 넘기거나 응답하는 경우가 그 예가 될 수 있습니다. 

.

static 과 bean 의 구분은 저도 명확한 기준을 가지고 있지 않습니다. 다만 MVC 구조를 형성하는 클래스 외에 다른 빈들은 스프링 빈으로 관리될 필요가 없다고 생각합니다. static는 말씀하신 것처럼 애플리케이션 전체에서 사용할 수 있는 유틸성 객체이면서 MVC 구조와 관련이 없는 경우 static 으로 관리합니다. 

.

질문 3)

SMTP를 처리하거나 FTP를 처리하는 클래스를 어떻게 만드느냐에 따라 달라질 수 있을 것 같습니다. 가령 파일을 업로드 하는 프로세스를 처리하는데 다음과 같이 FileUploadController, FileUploadService, FileUploadRepository 처럼 MVC 구조로 구현 한 뒤 내부에서 FTP에 대한 처리가 이루어진다면 스프링 빈으로 관리할 것이고, 단순히 파일과, 파일경로를 파라미터로 넘기면, 내부에서 접속과 업로드를 처리하는 형식이라면 static 으로 만드는게 편하겠지요.

.

정리하면, 그 메소드를 라이브러리처럼 단순히 호출하여 사용하고 싶으면 static으로 만들고, 프로세스 레벨로 구현하고 싶다면 스프링 빈으로 만듭니다.

.

추가로 라이브러리 처럼 사용한다 하더라도 그 사용빈도가 너무 희소하다면, static으로 관리하기 보단 필요할떄마다 new 로 생성해서 쓰는게 더 효율적일 수도 있습니다. GC의 효율이 예전처럼 나쁘지 않습니다. 자주 사용하지 않는 객체를 메모리에 상주시키것이 더 낭비일 수 있습니다. 경우에 따라 판단하셔야 합니다.

.


감사합니다.