Spring10 @ModelAttribute의 역할! @ModelAttribute 는 크게 두가지 역할을 한다. 이 예시로 이해를 해보자. /** * @ModelAttribute("item") Item item * model.addAttribute("item", item); 자동 추가 */ @PostMapping("/add") public String addItemV2(@ModelAttribute("item") Item item) { itemRepository.save(item); //model.addAttribute("item", item); //자동 추가, 생략 가능 return "basic/item"; } @ModelAttribute - 요청 파라미터 처리 @ModelAttribute 가 Item 객체를 생성하고, 요청 파라미터의 값을 프로퍼티 접근법.. 2022. 7. 3. 빈 스코프와 종류 빈 스코프란? 간단히 말해서 빈이 존재할 수 있는 (유지될 수 있는) 범위이다. 스프링이 지원하는 스코프는 다음과 같다. 1. 싱글톤 기본 스코프로 스프링 컨테이너의 시작과 종료까지 유지되는 가장 넓은 범위의 스코프이다. 항상 같은 인스턴스의 스프링 빈을 반환한다. 아래의 예제로 이해해보자. public class SingletonTest { @Test public void singletonBeanFind() { AnnotationConfigApplicationContext ac = new AnnotationConfigApplicationContext(SingletonBean.class); SingletonBean singletonBean1 = ac.getBean(SingletonBean.class); .. 2022. 7. 3. Thread Pool 이란 도대체 무엇인가! Thread Pool 동작원리 Thread Pool 필요한 Thread 를 Thread Pool 에 보관하고 관리한다. Thread Pool 에 생성 가능한 Thread 최대치를 관리한다. 톰켓은 최대 200개 기본 설정 ( 변경 가능 ) Thread 가 필요하면, 이미 생성되어 있는 Thread 를 Thread Pool 에서 꺼내서 사용 사용을 종료하면 Thread Pool 에 해당 Thread 를 반납 Thread 가 미리 생성되어 있으므로, Thread 를 생성하고 종료하는 비용(CPU)이 절약되고, 응답 시간이 빠르다. 생성 가능한 Thread 의 최대치가 있으므로 너무 많은 요청이 들어와도 기존 요청은 안전하게 처리할 수 있다. ✨ 최대 Thread 가 모두 사용중이여서 Thread Pool 에.. 2022. 6. 17. 빈 생명주기 콜백에 대해 알아보자 빈 생명주기 콜백이라는게 모지? 그냥 내가 이해한 바로는 스프링이 구동될때 DB 연결이나 Network 연결은 미리 해주어야 나중에 연결 지연이 생기는 것이 방지 된다고 한다. 그래서 그때 동작되는 스프링이 구동되고서부터 끝날때까지의 흐름?? 그리고 스프링이 구동되고 의존관계가 주입된 후에 어떤것이 호출되며 종료되기 전에는 어떤것이 호출되는지 그런흐름?? 모 나는 그렇게 이해했는데 아닐수도 ;;; 김영한님의 인프런 스프링 기본편강의 에서는 아래와 같은 흐름으로 동작한다고 하였다! 스프링 컨테이너 생성 → Bean 등록 → 의존관계주입 → 초기화콜백 → 사용 → 소멸전 콜백 → 스프링 종료 스프링은 크게 3가지 방법으로 빈 생명주기 콜백을 지원한다. 1. 인터페이스(InitializingBean, Disp.. 2022. 6. 4. 조회 빈이 2개 이상일 때 해결방법! 조회 빈이 2개 이상일 경우 해결방법! @Autowired 필드명 매칭 빈 조회시 타입으로 매칭이 되지만 동일 타입이 2개이상인 빈에 대해서는 타입 다음 필드(파라미터)명으로 빈을 조회 하게 된다. 따라서 동일 타입에 대해 필드(파라미터)명을 다르게 해주면 빈 충돌이 나지 않게된다! @Autowired public OrderServiceImpl(MemberRepository memberRepository, DiscountPolicy rateDiscountPolicy) { // ✅ 이렇게 파라미터명을 rate~로 다르게 해주면 충돌나지 않음! this.memberRepository = memberRepository; this.discountPolicy = rateDiscountPolicy; } @Quali.. 2022. 6. 4. [Springboot] Execution failed for task ':test' 에러 해결방법 SpringBoot 에서 테스트코드를 Run 했을때 갑자기 잘되던게 아래와 같은 에러 발생!! Execution failed for task ':test' ~~~~~~~~~ 아니 잘되던게 갑자기 왜 안되는거야ㅜㅜㅜㅜㅜㅜ 해결방법❗❗ File → Setting → Gradle 에서 아래를 IntelliJ IDEA 로 변경해주기!! 그럼 아래처럼 깔끔히 성공!! 근데 저렇게 해서 어찌저찌 잘 동작은 하는데,, 이유를 모르겠다 이유를!!!! Junit4가 아니라 5 버전이여야 된다는 글을 봤는데.. 분명 Junit5로 다 한것같은데 갑자기 안돼서 당황;; 이유 아시는 분 계시면 댓글부탁해여ㅜㅜㅜㅜ 2022. 6. 4. 의존관계가 아닐때 옵셔널처리 의존관계로 등록되지 않은 즉, 스프링 컨테이너가 관리하는 빈이 아닌 클래스에 대해 @Autowired 를 쓸때 어떻게 처리할 것인지에 관한 옵셔널 처리를 알아보자 아래에서 나오는 예제의 Member 클래스는 스프링 빈으로 등록되지 않은 일반 자바 클래스이다. @Autowired(required = false) 의존관계가 주입되지 않은 클래스가 하나라도 포함되어 있다면 아예 호출 자체를 하지 않는다. (의존관계가 주입된 클래스를 같이 써주어도 호출 되지 않았음) @Autowired(required = false) public void setNoBean1(Member noBean1) { System.out.println("noBean1 : "+noBean1); } @Nullable 의존관계가 주입되지 않은 .. 2022. 6. 4. 의존관계 주입방법 의존관계 주입 전 주의사항❗ 의존관계 주입은 스프링 컨테이너가 관리하는 스프링 빈이어야 동작한다! 스프링 빈으로 등록되지 않은 일반 자바 클래스 Member 같은 클래스에서 @Autowired 를 아무리 해봐야 소용이 없다!! 생성자 주입 이름 그대로 생성자를 통해서 의존 관계를 주입 받는 방법이다. 또한, 생성자 호출 시점에 딱 1번만 호출되므로 불변, 필수 의존관계에 사용해야한다. private final MemberRepository memberRepository; private final DiscountPolicy discountPolicy; @Autowired // ✅ 만약 생성자가 이것 하나뿐이라면 @Autowired 생략가능!! public OrderServiceImpl(MemberRepos.. 2022. 6. 4. @ComponentScan 과 @Autowired @ComponentScan 탄생배경 기존 스프링에서 빈을 등록할때 하나하나 @Bean 어노테이션을 사용하여 등록을 수동으로 해주어야했다. 하지만 이렇게 수동으로 하는방식은 너무너무 귀찮다아아ㅏ…!!!! 지겨워지겨워 알아서해줘어ㅓㅓㅓ 그래서 나온게 설정 정보가 없어도 자동으로 스프링 빈을 등록하는 @ComponentScan 이라는 어노테이션이 등장!! @ComponentScan 역할 스프링 구동시 @Component 어노테이션이 붙은 클래스를 모두 읽어서 자동으로 빈 등록을 해준다. 이때 빈의 기본 이름은 클래스명을 사용하되 맨 앞글자만 소문자를 사용한다. 직접 지정하고 싶다면 @Component(”merryChristmas”) 이렇게 직접 명시해주면 된다. 또한, @ComponentScan 이 붙은 클래.. 2022. 6. 4. 자동 빈 VS 수동 빈 충돌!!! 빈 이름이 중복될 경우 서로 충돌이 난다. 그 중 자동 빈 vs 수동 빈의 충돌을 알아보자. 아래처럼 @Component 어노테이션에 의해 자동으로 빈 등록이 되어 memoryMemberRepository 라는 빈이 등록 되었다. @Component public class MemoryMemberRepository implements MemberRepository { private static Map store = new HashMap(); @Override public void save(Member member) { store.put(member.getId(), member); } @Override public Member findById(Long memberId) { return store.get(me.. 2022. 5. 27. 이전 1 다음