반응형

H2 DB 연동 중에 다음과 같은 오류가 발생했다.

 

그림1. H2 Console 설정

H2 콘솔 설정은 다음과 같이 연결 후에

 

인텔리제이에서 아래와 같이 테스트 코드를 작성 하고 돌리면

 

다음과 같은 오류가 발생하였다.

오류 내용 : org.h2.jdbc.JdbcSQLNonTransientConnectionException: Database may be already in use

 

해결 방법 : 

H2 콘솔 페이지에서 연결을 해제하고 하면 오류가 발생하지 않았다. 하지만 H2 콘솔과 인텔리제이에서 동시에 접속이 가능해야 했기때문에 방법을 찾아보았고, 해결 방법은 다음과 같았다.

 

application.properties

spring.h2.console.enabled=true
spring.h2.console.path=/h2-console
#spring.datasource.url=jdbc:h2:~/Db명 # 수정 전
spring.datasource.url=jdbc:h2:tcp://localhost/~/Db명 # 수정 후
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=

H2 콘솔 접속 페이지

반응형
반응형

sql.xml

<select id="Dao랑 매핑시킬 ID" parameterType="파라미터 type" resultType="반환할 결과 type">
	SELECT CONCAT(T1.컬림A, ' > ', T1.컬럼B) FROM 테이블 T1
</select>

 

위와 같이 xml 파일에 쿼리문을 작성 할 떄, 다음과 같은 오류가 발생하게 됩니다.

 

Multiple annotations found at this line:

- The content of elements must consist of well-formed character data or markup.

- Start tag of element <select>

 

해당 오류가 발생하는 이유는 XML 에서 부등호를 문자열이 아닌 <select> </select>와 같이 시작과 끝을 알리는 TAG로 인식하기 때문입니다.

 

해결 방법

 

<select id="Dao랑 매핑시킬 ID" parameterType="파라미터 type" resultType="반환할 결과 type">
	<![CDATA[
		SELECT CONCAT(T1.컬림A, ' > ', T1.컬럼B) FROM 테이블 T1
	]]>
</select>

 

부등호를 사용 할 쿼리문에 <![CDATA[ ]]> 를 사용해주면 오류가 발생하지 않습니다.

반응형
반응형

이번에는 게시판에 적힌 글을 조회하는 포스팅을 하도록 하겠습니다.

 

우선 reviewVo에 조회할 때 필요한 조회 종류를 추가해주도록 하겠습니다.

 

reviweVo.java

조회 기능까지 추가된 후의 reviewVo.java

package com.example.mall.domain;


public class reviewVo {

	/*
	 CREATE TABLE reviewTable (
	reNum INT AUTO_INCREMENT PRIMARY key,
	reTitle VARCHAR(20) NOT null,
	reContent text not null,
	reUser VARCHAR(20) NOT null,
	reregisterDate DATE DEFAULT NOW(),
	reCnt INT DEFAULT 0 # 조회수
	
	  
	 */
	
	private int reNum;
	private String reTitle;
	private String reContent;
	private String reUser;
	private String reregisterDate;
	private int reCnt;
	
	private String searchName, searchValue; // 이름별 검색, 제목별 검색
	public String getSearchName() {
		return searchName;
	}
	public void setSearchName(String searchName) {
		this.searchName = searchName;
	}
	public String getSearchValue() {
		return searchValue;
	}
	public void setSearchValue(String searchValue) {
		this.searchValue = searchValue;
	}
	public int getReNum() {
		return reNum;
	}
	public void setReNum(int reNum) {
		this.reNum = reNum;
	}
	public String getReTitle() {
		return reTitle;
	}
	public void setReTitle(String reTitle) {
		this.reTitle = reTitle;
	}
	
	public String getReContent() {
		return reContent;
	}
	public void setReContent(String reContent) {
		this.reContent = reContent;
	}
	public String getReUser() {
		return reUser;
	}
	public void setReUser(String reUser) {
		this.reUser = reUser;
	}
	public String getReregisterDate() {
		return reregisterDate;
	}
	public void setReregisterDate(String reregisterDate) {
		this.reregisterDate = reregisterDate;
	}
	public int getReCnt() {
		return reCnt;
	}
	public void setReCnt(int reCnt) {
		this.reCnt = reCnt;
	}
	
}

reviewMapper.xml

<!-- 게시글 검색하기 -->
	<select id="selectsearch" resultType="reviewVo">
		select * from reviewTable where ${searchName} like concat('%',#{searchValue},'%') <!-- #은 데이터값 -->
	</select>

 

reviewmapper.java

// 게시글 검색하기
	public List<reviewVo> selectsearch(reviewVo reviewvo) throws Exception;

 

reviewService.java

	// 게시글 제목 또는 작성자로 검색하기
	public List<reviewVo> selectsearch(reviewVo reviewvo) throws Exception {
		return reviewmapper.selectsearch(reviewvo);
	}

 

view에 검색할 수 있는 form 양식 작성

 

list.jsp 

기능 검색 추가된 list.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>


<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
게시글 불러오기 
<br>
<table border="2">
<tr>
	<th>글번호</th><th>제목</th><th>내용</th><th>작성자</th><th>등록일</th><th>조회수</th>
</tr>
<c:forEach var="item" items="${relist}">
<tr>
<td>${item.reNum}</td>
<td><a href="detailreview?reNum=${item.reNum}">${item.reTitle}</a></td>
<td>${item.reContent}</td>
<td>${item.reUser}</td>
<td>${item.reregisterDate}</td>
<td>${item.reCnt}</td>
</c:forEach>
</table>
<a href="write">글쓰기</a>
<form action="search">
<table>
<tr>
<td><select name="searchName">
		<option value="reUser">작성자</option>
		<option value="reTitle">글제목</option>
		</select></td>
	<td colspan="2">
	<input type="text" name="searchValue">
	</td>
	<td>
	<input type="submit" value="검색">
	</td>
</tr>	
</table>
</form>
</body>
</html>

 

결과창

 

작성자 '롤'이 들어가는 글자로 검색해보겠습니다.

 

반응형
반응형

게시글을 클릭하면 조회수가 올라가도록 하는 글을 포스팅 하도록 하겠습니다.

 

reviewMapper.xml

	<!-- 조회수 올리기 -->
	<update id="updatereviewcnt">
		update reviewTable set reCnt = reCnt + 1 where reNum = #{reNum}
	</update>

update문으로 조회수(reCnt)를 1씩 증가시켜주도록 합니다.

 

reviewmapper.java

	// 문의글 조회수 올리기
	public int updatereviewcnt(String reNum);

reviewService.java

	// 조회수 올리기
	public int updatereviewcnt(String reNum) throws Exception {
		return reviewmapper.updatereviewcnt(reNum);
	}

 

reviewController.java

	// 게시글 자세히보기
	@RequestMapping(value="/detailreview")
	public ModelAndView detail(@RequestParam("reNum") String reNum) throws Exception {
		
		// 기존의 게시글 자세히 보기에서 추가된 부분
		reviewservice.updatereviewcnt(reNum);
		
		return new ModelAndView("detail","detail1",reviewservice.detail(reNum));
	}
    
    // 추가된 부분
    // reviewservice.updatereviewcnt(reNum);

 

글을 누르기 전

글을 누른 후

 

반응형
반응형

 

Autowired 란?

의존 대상을 설정 코드에서 직접 주입하지 않고 스프링이 자동으로 의존하는 빈 객체에 주입해주는 것을 자동 주입해주는 것 을 뜻합니다.

 

Autowired 설정하는 방법은 간단합니다.

 

1
2
3
4
5
6
7
8
9
10
11
@Service
public class GogekService {
    
    @Autowired
    private GogekDao GogekDao;
 
    
    public void setGogekDao(GogekDao gogekDao) {
        this.gogekDao = gogekDao;
    }
}
 

 

4 행에서 GogekDao 필드에 @Autowired 어노테이션을 추가해주었습니다.

@Autowired 어노테이션을 붙이면 설정 클래스에서 의존 주입을 하지 않아도 됩니다.

 

필드에 어노테이션이 붙어있으면 스프링이 해당 타입의 객체를 찾아 할당합니다.

 

 

Qualifier

 

자동 주입 가능한 빈이 2개 이상이면 주입할 빈을 따로 지정할 때 사용하는 어노테이션 종류입니다.

 

@Qualifier 어노테이션 사용 방법 1.

1
2
3
4
5
6
7
8
9
@Configuration
public class Gogek {
 
    @Bean
    @Qualifier("info")
    public GogekInfo gogekInfo() {
        return new GogekInfo();
    }
}

 

해당 소스코드에서 gogekInfo() 메서드에 "info" 값인 @Qualifier 어노테이션을 붙여 해당 빈의 한정하여 "info" 로 준다.

 

 

@Qualifier 어노테이션을 사용 방법 2.

1
2
3
4
5
6
7
8
9
10
11
12
public class Gogek {
    private GogekDao gogekDao;
    private GogekInfo info;
 
    ....
 
    @Autowired
    @Qualifier("info")
    public void setGogekInfo(GogekInfo info) {
        this.info = info;
    }
}
 

 

해당 소스코드는 setGogekInfo() 메서드에 @Autowired 어노테이션을 붙였으므로 GogekInfo타입의 빈을 자동으로 주입해줍니다.

여기서 Qualifier 값은 "info" 이므로 한정 값을 info로 의존 주입 후보로 지정합니다.

 

- 빈 이름과 기본 한정자

 

1
2
3
4
5
6
7
8
@Configuration
public class Gogek {
 
    @Bean
    public GogekInfo gogekInfo() {
        return new GogekInfo();
    }
}

 

Qualifier로 별도 지정해주지 않은 메소드의 경우는 메소드의 이름을 빈 이름으로 사용하게 됩니다.

 

여기서는 gogekInfo가 한정자가 됩니다.

 

Autowired는 필수사항일까 ?

 

Autowired는 붙인 타입에 해당하는 빈이 존재하지 않으면 오류를 출력한다.

 

이렇게 자동 주입할 빈이 없으면 불필요하게 Autowired를 사용할 필요가 없는 것이다. 그런 경우 Autowired의 속성을 false로 지정해주면 해결된다.

 

@Autowired(required = false)

반응형
반응형

스프링에서의 의존이란 ?

 

- DI (Dependency Injection)의 약자로 '의존 주입'이라고 합니다.

 

- 의존하는 객체를 직접 생성하는 것이 아닌 의존하는 객체를 전달받는 방식입니다 

 

- 기존 의존 객체를 직접 생성하는 방법은 new 연산자를 이용합니다.

 

- 여러 코드에서 사용하는 경우, 직접 생성하지 않고 DI를 이용하면 직접 생성했던 방식 (코드마다 수정이 필요한 방법)에 비하여 의존 주입 대상이 되는 객체에서 생성한 코드의 부분에서만 변경하면 됩니다.

 

- 객체를 생성하고 의존 객체를 주입해 주는 클래스를 따로 작성하는 방법을 조립기라고도 합니다.

 

 

- DI 방식 2가지

 

방법 1. 생성자 방식

 

1
2
3
4
5
6
7
8
9
@Service
public class GogekService {
 
    private GogekDao gogekDao;
 
// 생성자 통해서 의존 객체 주입 받기
    public GogekService(GogekDao gogekDao) {
        this.gogekDao = gogekDao;
    }
 

 

- 생성자 방식은 빈 객체를 생성하는 곳에서 모든 의존 객체가 주입

 

- 이 방식의 단점은 생성자의 파라미터 개수가 많으면 각 인자가 어떤 의존 객체를 정하는지 확인 하려면 생성자의 코드를 확인해야 합니다.

 

방법 2. 세터 메서드 방식

 

1
2
3
4
5
6
7
8
9
10
@Service
public class GogekService {
 
    private GogekDao GogekDao;
 
    @Autowired
    public void setGogekDao(GogekDao gogekDao) {
        this.gogekDao = gogekDao;
    }
}
 

 

- 세터 방식은 세터 메서드 이름을 통해 어떤 의존 객체가 주입되는지 알 수 있다.

 

- 이 방식의 단점은 필요한 의존 객체를 전달하지 않아도 불필요한 객체가 생성되기 때문에 널포인트에러가 발생할 수 있습니다.

반응형

'Spring > 새롭게 얻은 정보들' 카테고리의 다른 글

[Spring] FileUpload 썸네일 확장자 dependency  (0) 2022.04.15
[MaBatis] MyBatis 란?  (0) 2020.12.15
Spring - @Autowired & @Qualifier  (0) 2020.05.04

+ Recent posts