이 글의 코드와 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.
예를 들면 요구사항에서 회원 정보 관리 API를 만드는 내용이 적혀져 있다.
이런 경우 좋은 URI 설계는 리소스를 식별하는 것이다. 여기서 리소스는 회원을 의미한다.
회원 목록 조회 /members
회원 조회 /members/{id}
회원 등록 /members/{id}
회원 수정 /members/{id}
회원 삭제 /members/{id}
URI는 리소스만 식별하므로 리소스와 해당 리소스를 대상으로 하는 행위를 분리시킨다. 여기서 행위는 조회, 등록, 수정, 삭제을 의미한다.
행위(메서드)는 GET, POST, PUT, PATCH, DELETE 로 구분한다.
GET : 리소스를 조회한다.
POST : 요청 데이터 처리, 주로 등록에 사용한다.
PUT : 리소스를 완전히 대체한다. 해당 리소스가 없으면 생성한다.
PATCH : 리소스를 일부 변경한다. (PUT은 모든 것을 변경한다)
DELETE : 리소스를 삭제한다.
GET /search?q=hello&hl=ko HTTP/1.1
Host: www.google.com
이 글의 코드와 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.
이 글의 코드와 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.
이 글의 코드와 정보들은 강의를 들으며 정리한 내용을 토대로 작성하였습니다.
지금까지 스프링 빈을 등록할 때는 자바 코드의 @Bean을 통해서 설정 정보에 직접 등록할 스프링 빈을 나열했다면, 이번에는 자동으로 스프링 빈을 등록하는 컴포넌트 스캔 에 대해서 알아보자.
코드로 컴포넌트 스캔과 의존관계 자동 주입을 알아보자.
기존
AppConfig.java는 과거 코드와 테스트를 유지하기 위해 남겨두고 새로운AutoAppConfig.java를 만들었다.
package hello.core;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.FilterType;
@Configuration
@ComponentScan (
excludeFilters = @ComponentScan.Filter(type = FilterType.ANNOTATION, classes = Configuration.class)
)
public class AutoAppConfig {
}
컴포넌트 스캔을 사용하기 위해서는 @ComponentScan 을 설정 정보에 입력하면 된다.
여기서 excludeFilters는 사용한 이유는 앞서 AppConfig.java에서 만든 설정 정보들과 등록이 겹치기 때문이다.
따라서 겹치지 않기 위해 excludeFilters 사용하여 컴포넌트 스캔 대상에서 제외하는 방법으로 설정했다.
이제 각 클래스가 컴포넌트 스캔의 대상이 되도록 @Component 애노테이션을 붙여주면 된다.
MemoryMemberRepository @Component 추가
RateDiscountPolicy @Component 추가
@Component
public class MemberServiceImpl implements MemberService {
private final MemberRepository memberRepository;
@Autowired
public MemberServiceImpl(MemberRepository memberRepository) {
this.memberRepository = memberRepository;
}
}
@Autowired 는 의존관계를 자동으로 주입해준다.
그리고 @Autowired 를 사용하면 생성자에서 여러 의존관계도 한번에 주입받을 수 있다.
@Component
public class OrderServiceImpl implements OrderService {
private final MemberRepository memberRepository;
private final DiscountPolicy discountPolicy;
@Autowired
public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy
discountPolicy) {
this.memberRepository = memberRepository;
this.discountPolicy = discountPolicy;
}
}
@ComponentScan(
basePackages = "hello.core",
}
backPackages : 탐색할 패키지의 시작 위치를 지정한다.
해석하자면, “hello.core” 패키지를 포함해서 하위 패키지를 모두 탐색한다는 의미이다.
basePackages = {"hello.core", "hello.service"} 처럼 여러 시작 위치를 지정할 수도 있다.@ComponentScan(
basePackageClasses = AutoAppConfig.class,
}
basePackageClasses : 지정한 클래스의 패키지를 탐색 시작 위치로 지정한다.
패키지의 시작 위치를 지정하지 않으면 @ComponentScan이 붙은 설정 정보 클래스의 패키지가 시작 위치가 된다.
권장하는 방법은 패키지의 위치를 지정하지 않고, 설정 정보 클래스의 위치를 프로젝트 최상단에 두는 것이다. 스프링 부트도 이 방법을 기본으로 제공한다.
예를 들어 프로젝트가 다음과 같은 구조로 되어 있으면
com.hello
com.hello.service
com.hello.repository
com.hello 를 프로젝트 시작 루트로 하고, 여기에 AppConfig와 같은 메인 설정 정보를 두고, @ComponentScan 애노테이션을 붙이고, basePackages 지정은 생략한다.
그러면 com.hello 를 포함한 하위 패키지 모두 자동으로 컴포넌트 스캔의 대상이 된다.
컴포넌트 스캔은 Component 뿐만 아니라 다음과 같은 내용도 추가로 대상에 포함한다.
@Contoller : 스프링 MVC 컨트롤러에서 사용
@Service : 스프링 비즈니스 로직에서 사용
@Repository : 스프링 데이터 접근 계층에서 사용
@Configuration : 스프링 설정 정보에서 사용
메모리: 72.9 MB, 시간: 0.28 ms
코딩테스트 연습 > 2021 카카오 채용연계형 인턴십
class Solution {
public int solution(String s) {
String[] strArr = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};
for(int i = 0; i < strArr.length; i++) {
s = s.replaceAll(strArr[i], Integer.toString(i));
}
return Integer.parseInt(s);
}
}
Integer.toString(i) : 숫자를 문자로 변환하는 형 변환 방법이다.
String replaceAll(String regex, String replacement) : replace() 함수와 같이 첫번째 인자값은 변환하고자 하는 대상이 되는 문자열이며, 두번째 인자 값은 변환할 문자 값입니다.
s.replaceAll(strArr[i], Integer.toString(i)); : strArr[i]을 Integer.toString(i)으로 변환한다는 의미이다.그리고 result가 숫자로 출력되어야하므로 Integer.parseInt()를 쓴 것이다.
Integer.toString() 잊어버리지 말자.