• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

Failed to load ApplicationContext 오류

23.04.10 11:09 작성 조회수 1.44k

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님의 프로필

codesweaver

2023.04.10

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

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

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

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

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

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

감사합니다.

노원진님의 프로필

노원진

질문자

2023.04.10

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

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

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

  3. image

codesweaver님의 프로필

codesweaver

2023.04.10

안녕하세요 노원진님.

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

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