인프런 커뮤니티 질문&답변

노원진님의 프로필 이미지
노원진

작성한 질문수

스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술

스프링 JdbcTemplate

Failed to load ApplicationContext 오류

해결된 질문

작성

·

1.6K

1

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예)

[질문 내용]

package hellospring11.hellospring.service;

import hellospring11.hellospring.repository.JdbcMemberRepository;
import hellospring11.hellospring.repository.JdbcTemplateMemberRepository;
import hellospring11.hellospring.repository.MemberRepository;
import hellospring11.hellospring.repository.MemoryMemberRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import hellospring11.hellospring.service.MemberService;
import javax.sql.DataSource;


// 자바 코드로 스프링 빈 등록
// 실무에서는 이것 보다는 autowired를 사용 하는데 이방법은 리포지토리를 쉽게 변경을 할 계획이라서 일딴 이렇게 사용
@Configuration
public class SpringConfig {

    private final DataSource dataSource;

    @Autowired
    public SpringConfig(DataSource dataSource) {
        this.dataSource = dataSource;
    }


    @Bean
    public MemberService memberService(){
        return new MemberService(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository(){
        //return new MemoryMemberRepository();
        //return new JdbcMemberRepository(dataSource);
        return new JdbcTemplateMemberRepository(dataSource);
    }
}
package hellospring11.hellospring.repository;

import hellospring11.hellospring.domain.Member;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcInsert;

import javax.sql.DataSource;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;

public class JdbcTemplateMemberRepository implements MemberRepository{

    private final JdbcTemplate jdbcTemplate;

    // 생성자가 하나면 오토와이어드 생량 가능
    public JdbcTemplateMemberRepository(DataSource dataSource) {
        jdbcTemplate = new JdbcTemplate(dataSource);
    }

    @Override
    public Member save(Member member) {
        SimpleJdbcInsert jdbcInsert = new SimpleJdbcInsert(jdbcTemplate);
        jdbcInsert.withTableName("member").usingGeneratedKeyColumns("id");

        Map<String, Object> parameters = new HashMap<>();
        parameters.put("name", member.getName());

        Number key = jdbcInsert.executeAndReturnKey(new MapSqlParameterSource(parameters));
        member.setId(key.longValue());
        return member;
    }

    @Override
    public Optional<Member> findById(Long id) {
        List<Member> result = jdbcTemplate.query("select * from member where id = ?", memberRowMapper(), id);
        return result.stream().findAny();
    }

    @Override
    public Optional<Member> findByName(String name) {
        List<Member> result = jdbcTemplate.query("select * from member where name = ?", memberRowMapper(), name);
        return result.stream().findAny();
    }

    @Override
    public List<Member> findAll() {
        return jdbcTemplate.query("select * from member", memberRowMapper());
    }

    // 람다 함수로 만듬
    private RowMapper<Member> memberRowMapper(){
        return (rs, rowNum) -> {
            Member member = new Member();
            member.setId(rs.getLong("id"));
            member.setName((rs.getString("name")));
            return member;
        };
    }
}

MemberServiceIntegrationTest 테스트 파일에서 코드를 실행하는데 계속 오류가 나옵니다.

@WebAppConfiguration, @ContextConfiguration() 어노테이션을 추가 해보았는데도 오류가 발생하고 데이터베이스 서버는 실행되어 있습니다.

 

답변 1

1

안녕하세요. 노원진님, 공식 서포터즈 codesweaver 입니다.

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.

구글 드라이브 업로드 방법 링크

주의: 업로드시 권한 문제 꼭 확인해주세요

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

노원진님의 프로필 이미지
노원진
질문자

https://drive.google.com/file/d/11iW5F2JmeaDmrHfN9H0k3i-l4wyzy5IG/view?usp=share_link

  1. 인텔리제이 얼티메이트 사용중입니다. 테스트에 Service 폴더안 MemberServiceIntegrationTest 파일을 이용하여 실행하였습니다. H2데이터 베이스는 켜놨었습니다.

  2. MemberServiceIntegrationTest 클래스 전체를 실행하면 오류가 발생합니다.

  3. image

안녕하세요 노원진님.

MemberService.class 파일 상단의 @Service 애노테이션을 지우고 다시 시도해보시겠어요?

MemberService 가 SpringConfig.java, @Service 애노테이션 으로 두 번 선언되어 오류가 발생하는 것 같습니다.

 

노원진님의 프로필 이미지
노원진

작성한 질문수

질문하기