Programming/Spring framework 40

[오류 해결] Jdbc template의 RowMapper<T> 클래스 구현시 맵핑 객체 생성자 주의해서 보기.2022-02-23

우선 스프링으로 JDBC template를 이용해서, CRUD 서비스를 만드는 중, 분명 SQL 문으로 "Select * from member where Email = ?" 이렇게 잘 작성해서 DB에서 데이터를 뽑아왔다. 그런데, 이상하게 member 객체의 password와 name 멤버가 뒤바뀌어서 나오는 것이다. SQL 구문잘못도 아니고, Member클래스의 생성자를 뒤바꾸게 정의한것도 아니였다. 그런데 예기치 못한 부분에서 해결을 하였다. 바로 RowMapper 클래스의 존재였다. 우리는 일반 JDBC API가 아닌, 스프링으로 JDBC Template을 쓰는 중이다. 그래서 "조회" 를 할때는 ResultSet을 이용하는 것이 아닌, JdbcTemplate.query() 메서드를 이용한다. 이 ..

스프링으로JDBC Template을 이용한 DB연동 (JDBC API vs JDBC Template).2022-02-08

●들어가기전. 스프링으로 JDBC Template을 공부하면서, 일반 JDBC API를 썼을때와 어떤 차이점이 존재하는지, 유념하면서 공부해야지만이 JDBC Template을 완벽히 이해할 수 있다. 그러므로 내가 JDBC API를 공부할떄의 포스팅을 한번 복습하고 넘어와야 된다. 또, 진도를 나가며 계속 이 두 기술의 차이를 생각하면서 공부하면, 쉽게 머리에 들어온다. 나도 계속 비교하면서 공부할것이다. 스프링을 이용할려면, 아래의 자바 개념들을 숙지해야 한다. 람다식이란 한줄로 설명하자면, 람다식 그 자체로 익명 객체이고, 메서드이름과 반환값을 생략하여 메서드를 간단히 나나탠 것이다. 스트림은 DB에 접속해 데이터를 가공하는 SELECT 문과 비슷하게, 데이터의 가공처리를 초기단계-중간단계-마지막 단..

AOP 프로그래밍, 프록시에 대하여. 2021-12-16

우선적으로 AOP 란 Aspect Oriented Programing 의 약자이다. Aspect 란 측면이라는 뜻으로, 좁은 부분을 뜻한다. 즉, 측면 지향 프로그래밍 이란 것은, 프로그램상의 어느 한정적인 부분들을 나누어서 프로그래밍하는 것을 의미한다. 이 한정적인 부분을 공통부분이라 칭하고 핵심부분과 구분되어 별도시스템이 동작 가능하게 한다. 아래의 코드를 보자. public class RecCalculator implements Calculator{ @Override public long factorial(long num) { // TODO Auto-generated method stub if(num==1) { return 1; } return num*factorial(num-1); } } 위 코드..

스프링 웹 개발 입문강의. 요약.

테스트코드의 given when then 구성 given: 뭔가가 주어졌을 때, when: 이것을 실행했을 때, then: 결과가 이것이 나와야 함. 주석으로 이런 방식으로 테스트 코드 흐름을 구성하면, 가독성이 증가됨. 2021-02-16 스프링 빈 추가하기 첫 번째 방법(컴포넌트 스캔과 자동 의존관계 등록.) @Controller, @Component, @Service, 애너테이션 등으로 스프링 메인 메소드가 실행되었을 때, 스프링 컨테이너에 자체적으로 컴포넌트 스캔을 통해 스프링이 스프링 컨테이너의 구성요소(빈)으로 추가해주는 것이다. 여기서 컴포넌트 스캔의 범위는 메인 메서드가 있는 상위 패키지에 구현된 모든 패키지들을 뒤져서 다 스프링의 빈으로 추가해 주는 것이다. 여기서 파란색 펜 부분이, 컴..

인텔리제이 테스트 코드 작성 Tip.

Test 코드 작성 시 assert j assertJ의 static 메서드인, assertThat()을 사용하여, 에러메세지와, 테스트 코드의 가독성을 높여준다. assertThat(Actual).isEqualsTo(Expect); Actual:실제값, Expect: 기댓값. Intelli static import 빠르게 하는 법 art+enter 쳐서 옵션 선택하면, 자동으로 import 됨. assertThat 메서드 쓸 때, 사용. Test코드의 @AfterEach 애너테이션의 필요성 @AfterEach : 한번에 여러 테스트를 실행하면 메모리 DB에 직전 테스트의 결과가 남을 수 있다. 이렇게 되면 다음 이전 테스트 때문에 다음 테스트가 실패할 가능성이 있다. @AfterEach 를 사용하면 각 ..

스프링 웹 개발 입문(인프런 강의 요약). 2021-12-14

웹 서버에서 클라이언트에게 데이터를 전송하는 형태는 크게 정적 컨텐츠 전달 MVC와 템플릿 엔진의 동작 API의 전달 로 나뉘어 진다. 정적 컨텐츠 전달은 사용자가 url에 /hello-static.html 이라는 것을 요청하면 단순하게 우선 스프링은 스프링 컨테이너에 같은 이름의 컨트롤러(@라는 애너테이션이 붙은 것중 @Get Mapping 의 파라미터로 같은 이름이 있는지)가 있는지 확인 하고, 없으면, resources의 static이라는 파일에 같은 이름의 데이터가 있는지 확인하고, 있으면, 그대로 반환해준다. MVC는 model, view, controller 의 약자로, 사용자가 url에 hello-mvc 라는 걸 요청하면 스프링은 @Controller가 붙은 컨트롤러에서 구현된 클래스 중, ..

빈 라이프 사이클. InitializingBean, DiposableBean. 2021-11-29

우선 스프링 빈은 생명주기를 갖는다. 또 빈의 라이프 사이클은 스프링 컨테이너에 의해 관리받는다. 순서대로 빈 객체생성 -> 의존주입 -> 객체 초기화 -> 객체 소멸. 이런 주기를 갖는다. 모든 스프링 설정클래스에 의해 컨테이너에 등록되는 빈 객체는 위와같은 생명주기를 따른다. 컨테이너에 등록된 빈을 getBean() 메서드에 의해 사용가능한 기간은 초기화와 소멸 사이의 기간이다. 빈 객체의 소멸은 AnnotationConfigApplicationContext 클래스의 부모 클래스인 AbstractApplicationContext에 구현된 close() 메서드를 호출하면 된다. 그런데 이런 라이프사이클이 중요한 이유는 빈의 초기화와 소멸 단계에서 프로그램의 필요에 의해 수행되어야 하는 과정이 있을 경우..

@Component, 컴포넌트 스캔( 자동 스프링 빈 등록). 2021-11-23

우리는 그전까지는 @Configuration 애너테이션을 통해서 직접 스프링 설정 클래스를 작성해서 스프링 컨테이너에 등록하였다. 이 방법은 설정 클래스의 코드가 너무 길어진다는 단점이 있다. 앞 포스팅에서 설명했듯, @Autowired도 기존에는 생성자나 세터메서드 방식으로 의존 주입하던 방식에서 스프링에서 자동으로 의존 주입을 해준다. 그렇기때문에 설정 클래스의 코드가 더 간결해졌다. 이 @Component 애너테이션도 마찬가지이다. 이 애너테이션을 스프링 빈 객체로 등록하고자 하는 클래스에 붙이면, 스프링 설정클래스(@Configuration) 에서 등록할 필요 없이 스프링이 알아서 등록 해 준다. 예를 들면 기존에는, @Configuration public class AppCtx { @Bean p..

@Autowired의 스프링 빈 필수여부( null 값 전달.), 의존 자동주입과 수동주입의 우선순위. 2021-11-18

그런데 앞서 클래스에서 @Autowired로 주입하려는 객체가 스프링 컨테이너에 빈으로 등록되어 있지 않을 경우, 어떤 일이 일어날까? 우선 익셉션이 바로 난다. 우선 예시를 보여주기 위해서 가상의 FakeAutowired 클래스를 빈으로 등록하고, @Autowired를 통해 빈 설정클래스에 등록되어있지 않은 P라는 클래스를 맴버로 설정하였다. public class FakeAutowired { private practice p; //빈 에 등록되어있지 않은 객체 P. public FakeAutowired() { // TODO Auto-generated constructor stub } @Autowired public void setP(practice p) { this.p = p; } public voi..

의존 자동주입 할때 타입이 일치하는 빈 중 의존 주입할 대상 빈을 선택하는 방법: @Qualifer 이용법. 2021-11-12

그런데 의문점이 생길 것이다. 만약 @Autowired를 사용해서 의존 자동주입의 대상이 되는 빈을 컨테이너에서 찾을때, 컨테이너에 등록되어 있는 해당 타입과 일치하는 빈이 여러개이면 어떤 일이 일어날까? 우선 테스트를 해보자. @Configuration @Import(AppCtx2.class) public class AppCtx1 { @Bean public MemberDao memberdao() { MemberDao m=new MemberDao(); return m; } @Bean public MemberDao memberdao2() { MemberDao m=new MemberDao(); return m; } @Bean public MemberRegisterService mrsvc() { MemberR..