본문 바로가기

Study

[내일배움캠프 TIL] 8일차 - Spring 정리. 빈스코프

728x90
반응형

매일 코드 카타라고 코딩문제를 1시간씩 풀고 있는데,

푸는 과정에서 새롭게 배웠고, 그리고 항상 헷깔려서 기억해야할 것을 정리했습니다.

 

Java에서 배열을 정렬할 때 가장 많이 사용하는 Arrays.sort()와 그 내부 동작 원리인 Comparator, compareTo를 정리합니다.

1. Arrays.sort() 기본 사용법

java.util.Arrays 클래스에서 제공하는 static 메소드입니다.

  • 오름차순 정렬: Arrays.sort(배열)
  • 내림차순 정렬: Arrays.sort(배열, Collections.reverseOrder())
String[] arr = {"Apple", "Orange", "Banana"};
Arrays.sort(arr); // [Apple, Banana, Orange] (사전순)

 

2. 정렬의 핵심: compareTo() 함수

문자열(String) 객체끼리 비교할 때 사용하는 함수입니다. s1.compareTo(s2)를 호출하면 정수값을 반환합니다.

  • 반환값 < 0 (음수): s1이 s2보다 앞순서임 (작다)
  • 반환값 == 0: 두 값이 같음
  • 반환값 > 0 (양수): s1이 s2보다 뒤순서임 (크다)

팁: ASCII 코드 값의 차이를 반환한다고 생각하면 편합니다. a(97) - b(98) = -1 이므로 음수가 나옵니다.

 

 

3. 커스텀 정렬 (Comparator) 동작 원리

Arrays.sort()의 두 번째 인자에 내가 만든 함수를 넣으면, Java는 내부적으로 배열의 두 값(s1, s2)을 이 함수에 계속 집어넣어 비교합니다.

⭐️ 가장 중요한 규칙 (양수/음수)

Java의 정렬 알고리즘은 함수의 결과가 "양수(+)"일 때만 두 값의 자리를 바꿉니다.

비교 결과 (s1, s2) 반환값 의미 결과(Action)
음수 (-) s1 < s2 왼쪽이 더 작음 그대로 유지
양수 (+) s1 > s2 왼쪽이 더 큼 자리 바꿈 (Swap)

 

 

그리고 오늘 Spring 특강이있었는데, 아는 내용도 있었지만 몰랐던 거나 정리가 필요했던 부분들이 있었습니다.

정리해보았습니다.

 

1. 오늘의 학습 키워드

  • HTTP 파라미터: 데이터가 전달되는 위치에 따른 구분 (Path Variable vs Request Param)
  • 빈 스코프 (Bean Scope): 스프링 빈이 생성되고 살아있는 범위
  • 싱글톤 (Singleton): 스프링의 기본 객체 관리 방식과 효율성
  • 무상태 설계 (Stateless): 공유 객체 사용 시 주의해야 할 객체 설계 원칙

2. 핵심 키워드 상세 정리

🚦 Path Variable vs Request Param

두 방식 모두 클라이언트가 서버로 데이터를 보낼 때 사용하지만, **'목적'**이 다릅니다.

=> 사실 path로 구현하는걸 requestParam으로도 구현할 수 있는데, 국룰? 같은게 있다고 해서 궁금해서 찾아봤습니다.

  • Path Variable (@PathVariable)
    • URL 경로의 일부를 변수로 사용합니다.
    • 자원(Resource)의 **식별자(ID)**를 나타낼 때 주로 사용합니다. (예: /users/10 → 10번 유저라는 '정체성')
  • Request Param (@RequestParam)
    • URL 뒤에 ?key=value 형태로 붙는 쿼리 파라미터를 사용합니다.
    • 데이터를 정렬(Sort), 검색(Search), 필터링하는 부가 옵션을 보낼 때 적합합니다. (예: /users?sort=age → 유저 목록 중 '나이순'이라는 '조건')

🌱 빈 스코프 (Bean Scope)

빈 스코프란 빈이 생성되어 소멸하기까지 존재할 수 있는 범위를 말합니다.

  • 의미: 빈이 몇 개 만들어지는지, 그리고 얼마나 오래 살아있는지를 결정합니다.
  • 종류: 기본값인 싱글톤 외에도 프로토타입(Prototype), Request, Session 스코프 등이 있습니다.

💎 왜 싱글톤(Singleton)이 기본인가?

스프링은 기업용 대규모 시스템을 위해 만들어졌습니다. 매번 요청이 올 때마다 새로운 객체를 만들면 메모리 부하가 엄청나기 때문에, 하나만 만들어 공유하는 방식을 취합니다.

  • 이유: 대부분의 서비스(Service)와 리포지토리(Repository)는 로직만 수행할 뿐, 상태를 저장하지 않는(Stateless) 객체이기 때문입니다. 하나만 만들어서 여러 사람이 동시에 호출해도 문제가 없습니다.

⚠️ 싱글톤 사용 시 주의점 (무상태 설계)

여러 클라이언트가 하나의 객체 인스턴스를 공유하기 때문에 필드(Member Variable)에 상태를 저장하면 절대 안 됩니다.

  • 위험: 특정 사용자만 수정해야 할 값을 클래스 변수(필드)에 담아두면 다른 사용자에게 노출되거나 값이 덮어씌워질 수 있습니다.
  • 해결: 필드 대신 지역 변수, 파라미터, ThreadLocal 등을 사용하여 독립적인 값을 유지해야 합니다.

 

반응형