Spring
[Spring] 의존관계 자동 주입 방법 & 옵션 처리 & LOMBOK(롬복)
의존관계 자동 주입 방법 의존 관계 자동 주입에는 여러 가지 방법이 존재한다. 생성자 주입 지금까지 사용했던 방법이고 요즘은 대부분 이 방법을 사용한다. 생성자의 파라미터로 의존 관계를 주입한다. 컨테이너에 빈이 등록되면 빈의 인스턴스를 변경할 수 없고(불변), 필수로 설정해야 하는 정보가 있을 때 활용한다(필수)는 특징이 있다. 생성자가 1개만 있을 시 @Autowired를 따로 작성해주지 않아도 된다. 생성자 주입 장점 - 특징이였던 불변은 큰 장점이 된다. 순수 자바 코드로 테스트 코드를 작성할 때 누락된 내용이 있으면 컴파일 오류가 발생하여 오류를 찾기 쉽다. 또한 빈에 등록할 인스턴스를 임의로 new 해서 생성 후 생성자에 집어넣을 수 있다. 마지막으로 final 키워드를 사용할 수 있다. 의존..
[Spring] @ComponentScan & @Autowired (의존관계 자동 주입)
@Component, @ComponentScan 기존에 스프링 컨테이너에 빈을 등록하는 방법은 AppConfig에 @Bean 어노테이션을 작성하는 것이었다. 만약 등록해야 하는 빈이 수백 개라면? 설정 정보를 수백 개 작성해야 한다. 반복 작업은 실수가 생길 수 있고 하기 싫다 일단. 스프링은 오래 사용된 친절한 기술이므로 당연히 다른 방법이 있다. 빈에 등록하고 싶은 클래스에 @Component 어노테이션을 작성해준다. 그 다음 @Configuration을 작성한 클래스에 @ComponentScan을 작성한다. 끝이다. (?) @ComponentScan이 뜻대로 Component들을 scan하여 컨테이너에 빈으로 등록해준다. 빈에 등록할 때 해당 클래스의 이름을 가져와 빈의 이름으로 등록하는데 이때 첫..
[Spring] 싱글톤 컨테이너
싱글톤 블로그에 정리하는 느낌 내려면 정확한 정의가 필요할 것 같아서 방금 검색해보고 왔다. '하나'의 인스턴스만 생성하여 사용하는 디자인 패턴 어라? static이랑 겹치는 것 같은데? 하고 검색 한번 더 해봤다. static으로 만들면 가장 큰 차이점은 인터페이스를 구현할 수 없어서 다형성을 실현할 수 없다. 본격적으로 시작하면 웹 애플리케이션은 클라이언트의 요청이 끊임없이 들어온다고 한다. 예를 들어 주문 서비스 요청이 1000번 들어왔다. 이때 OrderServiceImpl을 1000개 만들어야 할까? 이런 메모리 낭비를 방지하기 위해 웹 애플리케이션 개발에서 싱글톤 패턴이 중요하다. 강의에서 싱글톤 패턴을 적용한 클래스를 만드는 방법을 하나 소개해 주었다. 일단 자기 자신을 static으로 선언..
[Spring] 스프링 컨테이너 & 스프링 빈 조회
스프링 컨테이너 AppConfig를 생성하고 main 메서드에서 아래 코드를 작성하였다. 코드의 역할은 스프링 컨테이너 생성이다. ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class); 컨테이너 안에는 AppConfig에서 @Bean으로 설정해둔 빈 들이 있다. ApplicationContext는 인터페이스이다. AnnotationConfigApplicationcontext는 자바 코드로 작성한 config를 사용하기 위한 구체 클래스이다. (config는 xml로도 작성될 수 도 있고 본인이 작성한 파일을 등록할 수도 있다.) AppConfig.class는 우리가 작성한 파일을 명시해준..
[Spring] AppConfig
AppConfig 단어 그대로 앱의 환경설정을 담당한다. 강의의 코드 중 주문 서비스 구현 코드를 예로 설명하겠다. 주문 서비스에서는 회원을 조회해서 등급별 할인을 적용해야 하므로 멤버 레포지토리와 할인 정책 관련 객체가 필요하다. 처음에 코드를 작성했을 때의 모습은 아래와 같다. MemberRepository memberRepository = new MemoryMemberRepository(); DiscountPolicy discountPolicy = new FixDiscountPolicy(); OrderServiceImpl 클래스 안에 위의 코드가 작성되어 있었다. 이는 DIP 와 OCP 원칙을 위반하게 된다. DIP 위반 추상화에 의존해야지 구체화에 의존하면 안된다. 즉 interface에만 의존해..
[Spring] Test
Test case 입문 강의 때와 같이 기능별로 클래스를 구분하여 코드를 작성해준다. (이 부분은 그냥 많이 해보면서 익숙해져야 할 것 같다. 역할의 분리와 java 문법 이해가 필요로 한 것이므로 굳이 정리를 하지 않겠다.) 각 기능들이 오류가 없이 작성되었는지 확인해주어야 한다. 어플리케이션 전체를 만들고 한 번에 실행 후 오류를 찾는 건? 해보지 않았지만 벌써 끔찍하다. 기능별로 테스트 케이스를 세분화하여 작성하는 게 좋다고 한다. junit 프레임워크를 사용한다. @Test @DisplayName("vip는 10% 할인이 적용되어야 한다.") void vip_o() { //given Member member = new Member(1L, "memberVip", Grade.VIP); //when i..
[Spring] 객체지향 기본 개념
다형성 객체지향에서 가장 중요한 부분 같다. (물론 내 생각) 객체를 사용하는 이유를 생각해보면 지금까지의 내 의견은 유연성이다. 인터페이스로 우선 작성 후 구체적인 구현을 진행한다. 인터페이스를 우선 작성하므로 나중에 수정 사항이 생겼을 때 코드 변경의 양이 확 줄어든다. 아직 강의자료에서의 경우만 봤지만 몇 안 되는 파일에서도 요구 사항이 변경되었을 때 간편함을 느낄 수 있었다. DB의 종류를 변경할 때도 다른 파일들은 DB의 인터페이스에만 의존하고 있기 때문에 추가적으로 수정할 사항이 줄어든다. 레고를 조립하듯이 필요한 것으로 바꾸어서 조립한다. 이해가 쏙쏙 된다. 입문편에서는 강제로 외우는 느낌이었지만 기본편 강의를 어느 정도 들어보니 체감할 수 있었다. 강의 자료 내용을 인용하자면 유연하고, 변..
[Spring] 동적 페이지 만들기
동적 페이지 정적 페이지와 다르게 동적 페이지는 controller와 데이터를 주고받는다. controller 코드를 본 후 하나씩 의미를 알아보겠다. @GetMapping("hello") public String hello(Model model) { model.addAttribute("data", "hello!!"); return "hello"; } 위의 코드를 작성하기 전에 클래스 위에 @Controller를 작성하여서 스프링이 인식하게 해 준다. @GetMapping("hello"): localhost:8080/hello가 입력되면 사용될 컨트롤러라는 뜻이다. (Model model): 컨트롤러에서 값을 전달할 때 model에 담아서 전달한다. model.addAttribute("data", "he..
[Spring] welcome page, 정적 페이지 만들기
두 내용을 설명하기 앞서 스프링에서 만든 결과물은 localhost:8080을 주소 창에 입력해서 확인할 수 있다. 스프링에 포함되어 있는 내장 톰켓 서버가 있기에 가능하다. welcome page 일반적으로 주소창에 주소를 입력하고 들어가면 나오는 첫 페이지를 welcome page라 부른다. 오른쪽 그림과 같이 resources/static에 index.html 파일을 생성해준다. 그러면 스프링 자체에서 resources/static/index.html 파일을 welcome page로 사용해준다. 탑재되어 있는 기능이라고 하니 파일 위치와 이름을 동일하게 작성해야 한다. 정적 페이지 (static) 정적 페이지는 별도로 데이터를 주고 받는 부분이 없다. (이름부터 static이니까 당연한 말이긴 하다..