개발

[에러일기] mapper 의존성주입

Domaya 2023. 1. 22. 20:46
package kr.or.kosa.security;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

import kr.or.kosa.dao.MemberDao;
import kr.or.kosa.dto.MemberDto;
import kr.or.kosa.security.domain.CustomUser;
import lombok.Setter;

public class CustomUserDetailService implements UserDetailsService{
	
	@Setter(onMethod_ = {@Autowired})
	private MemberDao memberDao;
	
	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		System.out.println("Load User By UserName : " + username);
		
		System.out.println("멤버dao : " + memberDao);
		//userName means userid
		MemberDto dto = memberDao.read(username);
		System.out.println("queried by memberdao : " + dto);
		
		
		return dto == null ? null : new CustomUser(dto);
	}

}

memberDao의존성 주입이 안 돼서 null이 나옴

따라서 MemberDto dto = memberDao.read(username)은 nullPointerException 발생...

 

교수님은 수업에서 service단에서 sqlSession을 autowired로 의존성을 주입하고,

그 후 아래 서비스 구현 함수에서 dao = sqlsession.getMapper(EmpDao.class)와 같이 동기화를 하셨다

 

책에서의 실습은 위와 같이 하지 않고 바로 dao를 autowired를 하는데

이를 위한 설정을 해놓지 않아서 null이 뜬듯...?

 

mapper 연결을 어떻게 하느냐의 차이인 것 같다

	<mybatis-spring:scan
		base-package="kr.or.kosa.dao" />

root-context.xml에 mapper가 구현하는 인터페이스가 들어있는 패키지를

위와 같이 작성했더니 올바르게 dao 의존성이 주입되었다.

 

기존에 내가 써온 방식은 저렇게 하지 않고 

    <!-- MyBatis 설정 START  -->
    <bean id="sqlSessionFactoryBean"  class="org.mybatis.spring.SqlSessionFactoryBean">
       <property name="dataSource" ref="driverManagerDataSource"></property>
       <property name="mapperLocations" value="classpath*:kosa/mapper/*xml" />
   </bean>

여기서 sqlSession이 읽어올 mapperLocation을 지정해준 거였고... ? ? ?

 

허 헷갈린다 ㅜ

 

--책보고왓음

 

mapper 설정 방법의 차이인듯

<mybatis-pspring:scan> 태그의 base-package속성은 지정된 패키지의 모든 마이바티스 관련 어노테이션을 찾아서 처리한다. Mapper를 설정하는 작업은 각각의 XML이나 Mapper 인터페이스를 설정할 수도 있지만 매번 너무 번잡하기 때문에 패키지를 인식하는 방법으로 작성하는 것이 편리하다.

 

 

...ㅠㅠ헷갈려 ~ 지금까지 저거 없이도 sqlSession에서 매퍼 잘만 불러왔는데

저 태그를 쓰면 sqlSession없이 매퍼를 쓸 수 있다는 건가??

 

 

https://linked2ev.github.io/mybatis/2019/09/08/MyBatis-5-MapperScan%EB%A5%BC-%ED%86%B5%ED%95%9C-Mapper-%EC%A3%BC%EC%9E%85-%EB%B0%A9%EC%8B%9D/

 

[MyBatis] MapperScan를 통한 Mapper 주입 방식

MyBatis에서 제공하는 mybatis-spring 연동모듈을 이용하면, @Mapper(애너테이션)을 이용하여 Mapper Interface를 스프링 빈으로 주입받아 DB에 접근하는 방법

linked2ev.github.io

https://juntcom.tistory.com/44

 

[Spring] 스프링 mapper 등록하기

mapper 등록하기 xml 설정 매퍼는 다음처럼 XML설정파일에 MapperFactoryBean을 두는 것으로 스프링에 등록된다. MapperFactoryBean은 SqlSessionFactory 나 SqlSessionTemplate가 필요하다. sqlSessionFactory 와 sqlSessionTemplat

juntcom.tistory.com

 

https://u-it.tistory.com/entry/Mybatis-Mapperxml-%EB%A7%A4%ED%8D%BC-%ED%8C%8C%EC%9D%BC%EC%9D%84-SqlSessionFactory-Interface-%EC%99%80%EC%97%B0%EB%8F%99%ED%95%98%EA%B8%B0-%EA%B0%9C%EB%85%90-%EC%9E%AC%EC%A0%95%EB%A6%AC

 

[Mybatis]SqlSessionTemplate/MapperInterface(3.0이전 / 3.0이후) 구현방식 차이

SqlSessionTemplate / MapperInterface MyBatis에 대한 간단한 설명 : https://u-it.tistory.com/36 Mapper xml파일 SqlSessionTemplate, MapperInterface 공통 Mapper.xml파일을 생성합니다. Mybatis xml파일이라는것을 doc타입 선언을 해

u-it.tistory.com

https://u-it.tistory.com/36

 

[Mybatis]란? / SqlSessionTemplate, MapperInterface 개념/빈 등록 설정

[MyBatis]란 무엇인가 에 대해서 또 SqlSessionTemplate/MapperInterface 두가지 방식에 따른 전체적인 구조 차이와 Mapper.xml 속성 차이에 대해 정리합니다. [MyBatis]란? 앞서 사용해 보았던 Jdbc-Template도 상당히

u-it.tistory.com

SqlSessionTemplate와 MapperInterface 기능을 수행하기위해 빈을 등록해주는 코드입니다.

두가지 방식중 사용할 방식만 선택하여 선언 및 주입시키면 되지만, 두가지 모두 주입시켜도 무관합니다.

 

둘다 같이 써도 된대 ㄱ- 걍 앞으로 둘다 박아놔야겟다