스프링 프레임워크의 역사

프레임워크: 뼈대나 근간을 이루는 코드들의 묶음

프레임워크를 이용한다는 의미: 프로그램의 기본흐름이나 구조를 정하고 모든 팀원이 이구조에 자신의 코드를 추가하는 방식으로 개발

장점: 실력이 부족한 개발자라 하더라도 반쯤 완성한 상태에서 필요한 부분을 조립하는 형태의 개발 가능

간단함, 전체 구조를 설계할 때 유용함, 다른 프레임워크들의 포용, 개발 생산성과 개발 도구의 지원

 

자바 기반의 프레임워크

IoC: 결합도

AOP:응집도

스프링 프레임워크

개발자들에게 컴포넌트 모델을 제공하고, 단순하면서도 일관성 있는API 집합을 제공하여 개발자들이 복잡한 응용프로그램을 설계하는 동안 복잡하고 어려운 기반 코드에 연연하지 않도록 도움을 줌.

 

특징
경량 컨테이너로서 자바 객체를 직접 관리, 각각의 객체 생성, 소멸과 같은 생명 주기를 관리하며 스프링으로부터 필요한 객체를 얻어올 수 있다.

의존성 주입(DI)을 통한 객체 간의 관계 구성

AOP지원

편리한 MVC구조

WAS의 종속적이지 않은 개발 환경

POJO(Plain Old Java Object: 경량의 자바 객체 또는 별도로 종속되지 않는 자바 객체를 의미) 방식의 프레임워크

일반적인 J2EE에 비하여 기존에 존재하는 라이브러리 등의 지원이 용이하고 객체가 가볍다.

 

스프링은 의존성 주입(Dependency Injection(DI): 객체 사이의 의존 관계가 자기자신이 아닌 외부에 의해서 설정) 지원

의존성 주입을 역제어(IoC:Inversion Of Control)

즉, 역제어의 한 형태가 의존성 주입(DI)

DI컨테이너: 어떤 클래스가 필요로하는 값이나 인스턴스를 자동으로 생성, 취득하여 연결시켜주는 역할

생명주기: init, service

 

스프링은 관점 지향 프로그래밍 지원(Aspect-Oriented Programming, AOP)

기능을 핵심 비지니스 로직과 공통 모듈로 구분하고 핵심 로직에 영향을 미치지 않고 사이사이에 공통 모듈을 효과적으로 잘 끼워넣도록 하는 개발 방법. 공통 모듈을 보안 인증, 로깅 같은 요소들이 해당

 

의존성(하나의 객체가 다른 객체 없이 제대로 된 역할을 할 수 없다는 것을 의미, 하나의 객체가 다른 객체의 상태에 따라 영향을 받는 것을 의미) 주입(외부에서 밀어 넣는 것)(DI) => 어떤 객체가 필요한 객체를 외부에서 밀어 넣는다.

 

스프링에서 ApplicationContext가 관리하는 객체들을 '빈'이라는 용어로 부르고 빈과빈 사이의 의존관계를 처리하는 방식으로 XML 설정,어노테이션 설정, Java 설정 방식을 이용 가능

 

IoC 컨테이너

서블릿 컨테이너 = 매핑 필요

서블릿 컨테이너 동작 순서

1./WEB-INF/web.xml 파일 구동

2.브라우저로부터 요청 수신

3.클래스를 찾아 객체를 생성하고 doGet() 메서드 호출

4. doGet() 메서드 실행 결과를 클라이언트 브라우저로 전송

 

제어의 역행: 컨테이너로 처리하는 것을 의미 소스에서 객체 생성과 의존 관계에 대한 코드가 사라져 결과적으로 낮은 결합도의 컴포넌트 제작 가능

결합도가 높으면 유지 보수가 어려움=> 결합도를 낮추기 위해서 가장 쉽게 생각할 수 있는 것이 객체 지향 프로그래밍의 핵심 개념인 다형성을 이용. 인터페이스를 추가, 모든 객체가 공통으로 가져야 할 메서드들을 추상 메서드로 선언하면 유지 보수가 용이해진다.

 

=>디자인 패턴 이용하기

factory 패턴(외부에서 주소값을 받아와서 반환)을 적용. 클라이언트에서 사용할 객체 생성을 캡슐화하여 느슨한 결합 상태로 만들어줌

 

스프링 xml 설정파일 제작

bean 엘리먼트 사용. id 생략 가능하지만 class는 생략 불가능, bean을 가지고 인스턴스 생성

init-method: servlet 컨테이너는 web.xml 파일에 등록된 servlet 클래스의 객체를 생성할 때 디폴트 생성자만 인식. 생성자로 serlvet 객체의 멤버변수를 초기화할 수 없다. 그래서 서블릿은 init() 메서드를 재정의 하여 멤버변수를 초기화

destroy-method: 객체를 삭제하기 직전에 호출될 임의의 메서드 지정 가능

 

scope 속성

scope의 속성값을 "singleton"으로 설정하고 클라이언트에서 세번 요청하면 한번만 나옴=> 인스턴스 한번만 생성

 "prototype"으로 설정: 해당 bean이 요청될 때마다 매번 새로운 객체를 생성하여 반환

 

스프링의 가장 중요한 특징: 객체의 생성과 의존 관계를 컨테이너가 자동으로 관리(IoC: 제어의 역행) = 스프링의 핵심원리

의존성 Lookup: 컨테이너가 애플리케이션 운영에 필요한 객체를 생성하고 클라이언트는 컨테이너가 생성한 객체를 검색하여 사용하는 방식

 

의존성 Injection: 객체 사이의 의존관계를 스프링 설정 파일에 등록된 정보를 바탕으로 컨테이너가 자동으로 처리

 

※스프링 오류: 인스턴스를 생성하지 않아서 나는 오류가 많음.

외장 스피커를 사용할려면 필드 생성을 해줘야 한다.

 

의존관계 변경

인터페이스 추가

<bean id="1" class="com.spring.polymorphism.1" />

1인터페이스 객체로 이동

 

설정 파일

Setter 인젝션을 사용하려면 <property> 엘리먼트를 사용해야하며 name 속성값이 호출하고자하는 메소드 이름

 

Setter 메서드 이름 : name 속성값

setSpeaker(): name="speaker"

setAddressList(): name="addressList"

setBoardDAO(): name="boardDAO"

 

어노테이션 기반 설정

컴포넌트 스캔 설정

: <bean> 등록하지 않고 자동으로 생성하려면 <context:component-scan />이라는 엘리먼트를 정의

이 설정을 추가하면 스프링 컨테이너는 클래스 패스에 있는 클래스들을 스캔하여 @Component가 설정된 클래스들을 자동으로 객체 생성 bean 설정파일 줄 필요없이 사용할 클래스 위에다 Annotation을 붙여준다.

 

@Autowired

생성자나 메서드, 멤버변수 위에 모두 사용가능

대부분 필드 위에 선언하여 사용. 해당 변수 타입을 체크, 그 타입의 객체가 메모리에 존재하는지를 확인한 후 그 객체를 필드에 주입. 주로 변수 위에 설정하여 해당 타입의 객체를 찾아서 자동으로 할당

@Autowired

private Speaker speaker;

 

@Qualifier: 특정 객체의 이름을 이용하여 의존성 주입할 때 사용. 의존성 주입 대상이 되는 객체가 두 개 이상일 때 발생. 객체의 이름이나 아이디 지정가능

 

추가 어노테이션

@Component를 상속 어떤 클래스가 어떤 역할을 수행하는지 파악하기 위해

 

control단 annotation

 

기본 핸들러 @Controller와 @RequestMapping 어노테이션스프링 웹 MVC의 주요 구성 요소

 

컨트롤러: 사용자 요청을 해석하고 모델과 뷰를 반환하는 기능을 가진 메서드들로 구성. 

@Controller로 컨트롤러임을 선언하고 @RequestMapping으로 요청 url 패턴을 지정

 

컨트롤러 기본 형식

@Controller

public class 컨트롤러명{

  @RequestMapping("요청url패턴")

   public 반환타입 메서드명(Model 파라메타명...){

             비즈니스 로직;

       return "뷰명";

   }

}

 

@RequestMapping: URL을 컨트롤러의 메서드와 매핑할 때 사용하는 스프링 프레임워크의 어노테이션이다.

클라이언트의 요청URL 패턴이나 HTTP요청 메서드에 대해서 컨트롤러의 클래스나 메서드에 선언

속성

path(혹은 value): 요청된 URL에 따라 매핑

method: GET,POST, PUT,DELETE 같은 HTTP Request method에 따라 매핑을 결정

headers: 특정 헤더의 값에 따라 매핑

produces: 서버에 응답 헤더 타입과 문자셋 설정. produces = "text/html; charset=utf-8"

 

 

ModelAndView: 컨트롤러가 디스패처  서블릿에 반환해야 하는 뷰와 모델 정보를 모두 포함하고 있는 객체를 반환

 

'spring, springboot' 카테고리의 다른 글

Model  (0) 2023.08.24
springBoot project 새로만들기  (0) 2023.08.22
springBoot  (0) 2023.08.21
Array, ArrayList,sampleDTOList  (0) 2023.08.18
springBoot  (0) 2023.08.17

const[state(값을 담을 변수), setState(변수값을 바꿔주는 함수)] = useState(초기값);

 

test1파일

const [movies, setMovies] = useState([
    {id:1, title:'Movie 1', genre:'Drama', release_date:'2022-01-01'},
    {id: 2, title: 'Movie 2', genre:'Action', release_date:'2022-02-01'},
    {id: 3, title:'Movie 3', genre:'Comedy', release_date: '2022-03-01'}
  ]);

movies: 값을 담을 변수

setMovies: 변수값을 바꿔주는 함수

[
    {id:1, title:'Movie 1', genre:'Drama', release_date:'2022-01-01'},
    {id: 2, title: 'Movie 2', genre:'Action', release_date:'2022-02-01'},
    {id: 3, title:'Movie 3', genre:'Comedy', release_date: '2022-03-01'}
  ]

: 초기값 배열

 

const{name, nickname}=state;은

const name = state.name;

const nickname= state.nickname이랑 같음

object에 있는 값을 바로 변수 할당

state안에 이미 name이랑 nickname이라는 변수가 있어서 변수선언

state를 console.log(state)해보면 {name:"홍길동",nickname:"홍아무개"}로 출력

 

const handleInputChange = (event) => {
const { name, value } = event.target;
setNewMovie({ ...newMovie, [name]: value });
};

객체 안에서 key를 [ ]로 감싸면 그 안에 넣은 레퍼런스가 가리키는 실제 값이 key 값으로 사용된다.

name이 key값

event.target은 함수를 전달하는 요소를 의미
const name = event.target.name
어떤 입력event.target에 handlChange를 전달하면 handleChange 함수를 전달한 곳에서 target이 입력됩니다.
 

스프레드 연산자(...): 기존 배열 객체의 값을 그대로 복사해와서 사용할 수 있는 연산자

const subject1=["국어", "영어", "수학"]

const subject2=["사회","과학"]

 

const subject=[...subject1, ...subject2]

console.log(subject)

["국어", "영어", "수학","사회","과학"]

 

some() 메서드는 배열한의 어떤 요소라도 주어진 판별 함수를 적어도 하나라도 통과하는지 테스트

배열 변경X

 

값이 배열 내 존재하는지 확인

 

const fruits = ["apple", "banana", "mango", "guava"];

function checkAvailability(arr, val) {
  return arr.some((arrVal) => val === arrVal);
}

checkAvailability(fruits, "kela"); // false
checkAvailability(fruits, "banana"); // true

https://developer.mozilla.org/ko/

'react' 카테고리의 다른 글

라우팅  (0) 2023.08.10
리액트  (0) 2023.08.03

장점

1. 보기 쉽고 익숙하다.

2. 더욱 높은 활용도

 

컴포넌트

 

프로젝트 생성

npm init react-app book-react

 

라우팅: 경로를 의미하는 Route와 진행을 뜻하는 ing가 합쳐진 단어로, '경로를 지정하는 과정' 의미, 페이지 라우팅은 요청에 따라 적절한 페이지를 반환하는 일련의 과정

 

리액트 라우터 설치(프로젝트 설정 후0

npm i react-router-dom

 

실행 방법

npm start

 

프로젝트에 라우터 적용하기

리액트 라우터가 제공하는 BrowserRouter컴포넌트로 App을 감싼다.

import { BrowserRouter } from 'react-router-dom';
root.render(
  /*<React.StrictMode>
    <App />
  </React.StrictMode>*/

  <BrowserRouter>
    <App/>
  </BrowserRouter>
);

 

book-react1

경로 설정, route, link to

 

이벤트를 사용할 때 주의 사항

이벤트 이름은 카멜 표기법으로 작성

이벤트에 실행할 자바스크립트 코드를 전달하는 것이 아니라, 함수 형태의 값을 전달

DOM요소에만 이벤트를 설정

 

keycode===13은 엔터

 

const App =() => {
  const [book, setBook] = useState(books);
 
  const onDelete=(targetId)=>{
    setBook(book.filter((it)=>it.id !== targetId))
  }
  return (
    <div className="App">
      {/**리액트 라우터로 페이지 라우팅을 구현하는 앱에서는 Link라는 컴포넌트를 이용한다.
       * <Link to='이동할 경로'>링크 이름</Link>
       */}
       <div className='Nav'>
        <Link to={"/"}>Home</Link>
        <Link to={"/add"}>Add</Link>
        <Link to={"/list"}>List</Link>
       </div>
      <Routes>
        {/*현재 URL 경로에 맞게 적절할 Route 컴포넌트를 페이지에 랜더링한다. */}
        <Route path="/" element={<Home/>}/>
        <Route path="/add" element={<Add />}/>
        <Route path ="/list" element={<List book={book} onDelete={onDelete} />}/>
      </Routes>
    </div>
  );
}

'react' 카테고리의 다른 글

const[변수,함수]=useSate, event.target,...스프레드 연산자, some연산자  (0) 2023.08.16
리액트  (0) 2023.08.03
//반드시 하나의 요소들만 반환하여야한다. div로 감싼다.
function App(){
  return(
    <div>
        <h1>리액트 안녕~!!</h1>
        <h2>프로그래밍 시작합니다.</h2>
    </div>
  )
}

Node.js 설치

index.js는 진입

App.js는 기본

import 구문을 특정 파일을 불러오는 것을 의미.

Node.js에서는 import가 아닌 require라는 구문으로 패키지를 불러올 수 있다.

이러한 기능을 브라우저에서도 사용하기 위해 번들러사용

번들러: 웹팩, Parcel, browserify라는 도구 등

리액트 프로젝트에서는 웹팩 사용

번들러를 사용하면 import 또는 require로 모듈을 불러왔을 때 불러온 모듈을 모두 합쳐서 하나의 파일 생성. 최적화 과정에서 여러 개의 파일로 분리

babel - loader는 자바스크립트 파일들을 불러오면서 최신 자바스크립트 문법으로 작성된 코드를 바벨이라는 도구를 사용하여 ES5 문법으로 변환(구버전 웹브라우저와 호환하기 위해서)

 

JSX: 자바 스크립트 확장 문법. 브라우저에서 실행되기 전에 코드가 번들링되는 과정에서 바벨을 사용하여 일반 자바스크립트 형태의 코드로 변환

시작과 끝이 엄격함.

 

div로 감싸야한다.

 

import { Fragment } from "react";

//Fragment 사용
function App(){
  return(
    <Fragment>
      <h1>리액트 안녕</h1>
      <h2>잘 실행되는지 확인해 봅시다.</h2>
    </Fragment>
  );
}

 

'react' 카테고리의 다른 글

const[변수,함수]=useSate, event.target,...스프레드 연산자, some연산자  (0) 2023.08.16
라우팅  (0) 2023.08.10

git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks fetch --no-tags origin

git -c diff.mnemonicprefix=false -c core.quotepath=false --no-optional-locks pull --no-commit origin dev
From https://github.com/citygray/groupStudy
 * branch            dev        -> FETCH_HEAD
error: The following untracked working tree files would be overwritten by merge:

 

 

 

https://sangnam2.tistory.com/entry/git-pull-%EC%97%90%EB%9F%AC-error-The-following-untracked-working-tree-files-would-be-overwritten-by-mergePlease-move-or-remove-them-before-you-merge

 

git pull 에러 (error : The following untracked working tree files would be overwritten by merge:Please move or remove them be

error : The following untracked working tree files would be overwritten by merge:Please move or remove them before you merge 문제가 되는 파일을 이동하거나 지우라는 뜻 이다. git add -A git stash git pull 해당 명령어를 입력하면

sangnam2.tistory.com

 

문제가 되는 파일을 삭제하거나 이동하라는 뜻

 
git add -A
 
git stash
 
git pull

'개인 공부 or 오류' 카테고리의 다른 글

모달창 구현 연습  (0) 2023.08.19
회원가입창  (0) 2023.08.03
복습, parameterMap, parameterType, resultMap, resultType  (0) 2023.08.02
MyBatis 연습  (0) 2023.08.01

조건문 <c:choose>, <c:when>, <c:otherwise>

<c:choose>는 Java 언어의 switch~ case와 비슷하게 여러 조건중에 하나를 선택한다. <c:choose>는 switch에 해당되고 <c:when>는 case에 해당되며, <c:otherwise>는 default에 해당된다.

 

controller주소는 .do

jsp에서는 .do안 붙여도 가능

 

로그아웃 컨트롤러에서 session을 제거

		HttpSession session = null;
		session = request.getSession(false);	//기존 세션 객체 존재시 반환. 없으면 null반환
		session.invalidate();
		return "/board/getBoardList.do";

 

오류1.

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='id', mode=IN, javaType=class java.lang.String, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #1 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 부적합한 열 유형: 1111
### The error may exist in query/member.xml
### The error may involve com.mvc.member.dao.memberMapper.updateInfoForm-Inline
### The error occurred while setting parameters
### SQL: SELECT id, name, email, phone, regdate FROM member where id=?
### Cause: org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='id', mode=IN, javaType=class java.lang.String, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #1 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 부적합한 열 유형: 1111
	org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149)
	org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
	org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76)
	com.mvc.member.dao.MemberMapperImpl.updateInfoForm(MemberMapperImpl.java:57)
	com.mvc.member.service.MemberServiceImpl.updateInfoForm(MemberServiceImpl.java:51)
	com.mvc.member.controller.UpdateInfoFormController.execute(UpdateInfoFormController.java:25)
	com.mvc.common.controller.DispatcherServlet.process(DispatcherServlet.java:51)
	com.mvc.common.controller.DispatcherServlet.doGet(DispatcherServlet.java:25)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:529)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
	com.mvc.common.util.EncoderFilter.doFilter(EncoderFilter.java:25)

return값을 안 줬다...ㅠㅠ

 

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='id', mode=IN, javaType=class java.lang.String, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #1 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 부적합한 열 유형: 1111
### The error may exist in query/member.xml
### The error may involve com.mvc.member.dao.memberMapper.updateInfoForm-Inline
### The error occurred while setting parameters
### SQL: SELECT id, name, email, phone, regdate FROM member where id=?
### Cause: org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ParameterMapping{property='id', mode=IN, javaType=class java.lang.String, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}. Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #1 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 부적합한 열 유형: 1111
	org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
	org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:149)
	org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
	org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76)
	com.mvc.member.dao.MemberMapperImpl.updateInfoForm(MemberMapperImpl.java:57)
	com.mvc.member.service.MemberServiceImpl.updateInfoForm(MemberServiceImpl.java:51)
	com.mvc.member.controller.UpdateInfoFormController.execute(UpdateInfoFormController.java:25)
	com.mvc.common.controller.DispatcherServlet.process(DispatcherServlet.java:51)
	com.mvc.common.controller.DispatcherServlet.doGet(DispatcherServlet.java:25)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:529)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
	com.mvc.common.util.EncoderFilter.doFilter(EncoderFilter.java:25)

session으로 값을 가져와서 해주니 해결

 

부적합한 열유형

name, id 값 오타가 났다.

java.sql.SQLException: 부적합한 열 유형: 1111
	oracle.jdbc.driver.OracleStatement.getInternalType(OracleStatement.java:4031)
	oracle.jdbc.driver.OraclePreparedStatement.setNullCritical(OraclePreparedStatement.java:4182)
	oracle.jdbc.driver.OraclePreparedStatement.setNull(OraclePreparedStatement.java:4166)
	oracle.jdbc.driver.OraclePreparedStatementWrapper.setNull(OraclePreparedStatementWrapper.java:1008)
	java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	java.base/java.lang.reflect.Method.invoke(Method.java:568)
	org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:67)
	jdk.proxy3/jdk.proxy3.$Proxy8.setNull(Unknown Source)
	org.apache.ibatis.type.BaseTypeHandler.setParameter(BaseTypeHandler.java:65)
	org.apache.ibatis.scripting.defaults.DefaultParameterHandler.setParameters(DefaultParameterHandler.java:87)
	org.apache.ibatis.executor.statement.PreparedStatementHandler.parameterize(PreparedStatementHandler.java:94)
	org.apache.ibatis.executor.statement.RoutingStatementHandler.parameterize(RoutingStatementHandler.java:64)
	org.apache.ibatis.executor.SimpleExecutor.prepareStatement(SimpleExecutor.java:88)
	org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:62)
	org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:325)
	org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:156)
	org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:109)
	org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:89)
	org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:147)
	org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:140)
	org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:76)
	com.mvc.member.dao.MemberMapperImpl.updateMember(MemberMapperImpl.java:38)
	com.mvc.member.service.MemberServiceImpl.updateMember(MemberServiceImpl.java:56)
	com.mvc.member.controller.UpdateMemberController.execute(UpdateMemberController.java:27)
	com.mvc.common.controller.DispatcherServlet.process(DispatcherServlet.java:51)
	com.mvc.common.controller.DispatcherServlet.doGet(DispatcherServlet.java:25)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:529)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:623)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
	com.mvc.common.util.EncoderFilter.doFilter(EncoderFilter.java:25)

 

update에서는 반환형이 int라 MemberVO를 반환해 주는 것이 아니라 int값을 반환해 줘야 한다.

mapper에서 쓰인

<update id="appTest">

update ~ set ~ 이 구문이

</update>

 

controller에 와서

int a = service.appTest(~)

a.put("success", (a==1));

 

 

이런식으로 오는 것을 발견했다.

아니, 리턴값이 없는데 갑자기 int...?

찍어보니 1을 리턴하는 걸 보고 읭했다.

 

찾아보니 insert, update, delete에는 resultType이 없고

row의 개수를 반환한다고 한다.

 

insert의 경우는 삽입된 행의 개수를 반환

update의 경우는 수정에 성공한 행의 개수를 반환(실패시 0 반환)

delete의 경우는 삭제한 행의 개수를 반환

 

즉, 저 구문은 update 성공시에 웬만하면 1을 반환하고

실패시는 0이므로 put에 success를 넣은 것

 

 Cannot invoke "com.mvc.common.controller.Controller.execute(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)" because "ctrl" is null

맵핑을 주석 처리 해놓은걸 해제 안했었다.

 

 

'개인 공부 or 오류' 카테고리의 다른 글

모달창 구현 연습  (0) 2023.08.19
소스 트리 오류  (0) 2023.08.03
복습, parameterMap, parameterType, resultMap, resultType  (0) 2023.08.02
MyBatis 연습  (0) 2023.08.01
  • parameterMap : 비즈니스 로직으로부터 전달 받은, SQL 구문에 사용될 매개변수를 담은 객체
  • parameterType : 비즈니스 로직으로부터 전달 받은, SQL 구문에 사용될 매개변수의 자료형
  • resultMap : 비즈니스 로직으로 반환할, 결과값을 담은 객체
  • resultType : 비즈니스 로직으로 반환할, 결과값의 자료형

parameterType을 사용하는 방법

  • 파라미터의 값으로 사용: #{변수명}
  • 파라미터 명으로 사용: ${변수명}

ajax은 화면 전환이 없다.

'개인 공부 or 오류' 카테고리의 다른 글

모달창 구현 연습  (0) 2023.08.19
소스 트리 오류  (0) 2023.08.03
회원가입창  (0) 2023.08.03
MyBatis 연습  (0) 2023.08.01

+ Recent posts