스프링 오류

예외 메시지 내용

Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'A' not found. Available parameters are [B]


예외 메시지 상세 내용 중 일부

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'A' not found. Available parameters are [B]


원인

 - Dao에서 넘겨준 매개변수 객체 B에 멤버 변수 A가 없는 경우


해결

 - 객체 B의 멤버 변수 A가 있는지 확인하여 없으면 추가

 - 있는 경우에 에러가 나는 경우

  1. Dao에 @Param("B")을 넣어줬으면 Mapper에서 #{B.A}로 사용

  2. Dao에 @Param("B")를 안 넣어줬으면 Mapper에서 #{A}로 사용


스프링 오류

 예외 메시지 내용

Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException


 예외 메시지 상세 내용 중 일부

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.jdbc.BadSqlGrammarException

### Error querying database.  Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ~~


원인1

 - 잘못된 SQL 문법을 사용

해결1

 - 올바른 SQL문으로 수정


원인2

 - Mapper에서 외부 정보를 ${변수명}으로 표현한 경우

해결2

 - 외부 정보를 #{변수명}으로 수정



ajax의 기본 속성 값

async(Asynchronous) 

  • 비동기를 설정하는 속성으로 true면 비동기, false면 동기 방식으로 동작
  • 비동기방식으로 동작을 시키면 ajax가 처리되는 것과 별개로 ajax 이후 코드들이 실행
  • 동기 방식으로 동작을 시키면 ajax 처리가 다 끝나고 ajax 이후 코드들이 실행

type

  • 요청하는 방식을 설정하는 속성으로 post와 get 방식이 있음
  • get 
    • get 방식은 데이터를 URI(Uniform Resource Identifier)에 실어 보내는 방식으로 데이터가 적거나 보안이 필요하지 않은 경우
    • 화면을 보여주기 위해서는 get방식이 필수
    • 대표적으로 게시글을 보여줄때 사용
  • post
    • post 방식은 데이터를 BODY에 포함하여 전달하는 방식
    • 디비에 정보를 처리하기 위한 방식으로 사용
    • 대표적으로 회원가입, 로그인, 게시판 등록 등이 있음


url

  • 업무를 요청하기 위한 URL(Uniform Resource Locator)를 설정


dataType

  • 서버에서 보내줄 데이터 타입을 설정


contentType

  • 서버로 보낼 데이터 타입을 설정
  • 서버로 Object로 데이터를 보내기위해서는 contentType 생략


예시

  • jsp에서 ajax를 이용하여 넘겨준 데이터를 컨트롤러에서 객체로 받는 예제
  • 컨트롤러
1
2
3
4
5
6
7
@RequestMapping(value ="/checkemail",method = RequestMethod.POST)
public Map<Object, Object> emailcheck(User user){
    Map<Object, Object> map = new HashMap<Object, Object>();
    map.put("id",user.getId());
    map.put("email", user.getEmail());
    return map;
}

cs
  • User 클래스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class User{
    String id;
    String email;
    public String getId() {
        return id;
    }
    public void setId(String id) {
        this.id = id;
    }
    public String getEmail() {
        return email;
    }
    public void setEmail(String email) {
        this.email = email;
    }
}

cs
  • jsp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<html>
<head>
    <meta charset="UTF-8">
    <script type="text/javascript" src="//code.jquery.com/jquery-3.4.1.js"></script>
    <script type="text/javascript">
        $(document).ready(function(){
            $('#ajaxTest').click(function(){
                var m = {'id':'test123''email''test@gmail.com'}
                $.ajax({
                async:true,
                type:'POST',
                data:m,
                url:"<%=request.getContextPath()%>/checkemail",
                dataType:"json",
                success : function(data){
                    console.log(data.id,' : ' , data.email);
                }
            });
            });
        })
        
    </script>
</head>
<body>
    <button type="button" id="ajaxTest">ajax 테스트</button>
</body>
</html>
cs



DB와 연동하기(MyBatis)

  • 이 블로그의 글은 JAVA DB 엔지니어링 과정 수업을 위해 작성된 글입니다.

  • 이미지로 인해 글이 길어질 수 있습니다.


의존성 추가하기

  • MyBatis 연동에 필요한 의존성을 pom.xml에서 dependencies 태그 안에 추가합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<!-- mybatis 의존성 추가 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.1</version>
</dependency>
<!-- mybatis-spring 의존성 추가 -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>1.3.0</version>
</dependency>
<!-- mysql-connector-java 의존성 추가 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.11</version>
</dependency>
<!-- spring-jdbc 추가 -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>${org.springframework-version}</version>
</dependency>

cs


  • 설치된 MySQL 버전이 8이상이라 mysql-connector-java의 버전을 8.0.11로 설정했습니다.


MyBatis 관련 정보 설정하기 - root-context.xml

  • MyBatis 관련 정보를 설정하기 위해 root-context.xml 파일에 다음 항목들을 추가합니다.


네임스페이스 추가

  • root-context.xml 파일을 열어 namespace 탭을 클릭합니다.
  • aop, beans, context, jdbc, mybatis-spring 선택 후 저장합니다.


MySQL 정보 추가

  • 해당 프로젝트에서 사용할 스키마이름(DB명)과 MySQL 계정아이디와 비밀번호를 입력하여 적용하면 됩니다.
1
2
3
4
5
6
7
8
9
10
11
12
<bean id="dataSource"
      class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <!-- MySQL 버전에 따라 driverClassName의 value값이 달라짐 아래 코드는 Mysql 8기준 -->
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <!-- MySQL 버전이 6인 경우 아래 코드 반영 -->
    <!-- <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property> -->
    <property name="url"
              value="jdbc:mysql://localhost:3306/스키마이름?useSSL=false&amp;serverTimezone=Asia/Seoul">
    </property>
    <property name="username" value="MySQL계정아이디"></property>
    <property name="password" value="MySQL계정비번"></property>
</bean> 

cs
  • 예시
1
2
3
4
5
6
7
8
9
<bean id="dataSource"
      class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
    <property name="url"
              value="jdbc:mysql://localhost:3306/spring?useSSL=false&amp;serverTimezone=UTC">
    </property>
    <property name="username" value="green"></property>
    <property name="password" value="cjgreen"></property>
</bean>  

cs


Mapper 설정

  • mapperLocation의 value에 경로는 src/main/resources 폴더의 하위 경로입니다.
  • 경로에 mappers를 입력했다면 resources에 mappers 폴더를 생성하면 됩니다.
1
2
3
4
5
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath:경로/*Mapper.xml"></property>
</bean>
<mybatis-spring:scan base-package="맵핑할패키지이름"/>

cs

  • 예시
1
2
3
4
5
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="mapperLocations" value="classpath:mappers/**/*Mapper.xml"></property>
</bean>
<mybatis-spring:scan base-package="kr.green.spring.dao"/>

cs


MyBatis 연동 확인하기

  • 다음 작업은 오로지 연동을 확인하기 위한 작업으로 추후 메소드가 삭제되거나 수정될 수 있습니다.


MemberMapper 설정

  • mappers 폴더에 MemberMapper.xml 파일 생성 후 아래 예시 코드 복사하여 붙여넣습니다.
1
2
3
4
5
6
7
8
9
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
  PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="kr.green.spring.dao.MemberDAO">
  <select id="getEmail" resultType="String">
    select email from member where id = #{id}
  </select>
</mapper>

cs


MemberDAO 설정

  • kr.green.spring.dao 패키지 생성 후 MemberDAO 인터페이스 생성 후 다음 코드를 추가합니다.
1
2
3
4
5
6
7
8
package kr.green.spring.dao;
 
import org.apache.ibatis.annotations.Param;
 
public interface MemberDAO {
    public String getEmail(@Param("id")String id);
}
 

cs


MemberService 설정

  • kr.green.spring.service 패키지 생성 후 MemberService 인터페이스와 MemberServiceImp 생성 후 다음 코드를 추가합니다.
  • MemberService 인터페이스
1
2
3
4
5
6
package kr.green.spring.service;
 
public interface MemberService {
    public String getEmail(String id);
}
 

cs
  • MemberServiceImp 클래스
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package kr.green.spring.service;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
 
import kr.green.spring.dao.MemberDAO;
 
@Service
public class MemberServiceImp implements MemberService {
    @Autowired
    MemberDAO memberDao;
    
    @Override
    public String getEmail(String id) {
        return memberDao.getEmail(id);
    }
}
 

cs


HomeController 설정

  • HomeController에 다음 메소드와 멤버 변수를 추가합니다. id에 입력한 문자열 "12345678"은 실제 DB에 있는 회원 정보이어야 합니다.
1
2
3
4
5
6
7
8
9
10
    @Autowired
    MemberService memberService;
    
    @RequestMapping(value="/")
    public ModelAndView main(ModelAndView mv) throws Exception{
        mv.setViewName("/main/home");
        mv.addObject("setHeader""타일즈테스트");
        System.out.println(memberService.getEmail("12345678"));
        return mv;
    }

cs



수고하셨습니다.!!

+ Recent posts