빈 문자열, NULL검사 방법에는 아래가 존재합니다

 

#length

//길이 검사
String str = "";
if(str.length == 0){
}

//공백 제거 후 길이 검사
String str = "";
if(str.trim().length == 0){ // 공백 스페이스 제거 후 길이 검사
}

//NULL 검사 추가
String str = "";
if(str.length == 0 || str == NULL){
}

 

#equals()

String str = "";
if(str.equals("")){
}

//NULL 검사 추가
String str = "";
if(str.equals("") || str == NULL){
}

 

#isEmpty() : JAVA6 이상

String str = "";
if(str.isEmpty()){
}


String str = "";
if(str.trim().isEmpty()){//공백 스페이스 제거 후 NULL검사
}

//NULL 검사 추가
String str = "";
if(str.isEmpty("") || str == NULL){
}

 

#isBlank() : JAVA11 이상, NULL이거나  공백 스페이스면 TRUE를 반환

String str = "";
if(str.isBlank()){
}

//NULL 검사 추가
String str = "";
if(str.isBlank("") || str == NULL){
}

 

 

하지만 위의 방법은 빈값 검사일뿐 NULL처리에 대한 코드가 없어서

값이 NULL일 경우 IF문에 str == NULL과 같은 NULL에 대한 대응을 하지 않으면

결과에서 NullPointException에러를 발생시킵니다

 

그 외에 외부 라이브러리를 사용한 방법이 있는데

Apache Commons Lang입니다

 

https://mvnrepository.com/artifact/org.apache.commons/commons-lang3

 

Maven Repository: org.apache.commons » commons-lang3

Apache Commons Lang, a package of Java utility classes for the classes that are in java.lang's hierarchy, or are considered to be so standard as to justify existence in java.lang. VersionRepositoryUsagesDate3.11.x3.11Central1,231Jul, 20203.10.x3.10Central1

mvnrepository.com

#Maven

<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-lang3</artifactId>
    <version>3.9</version>
</dependency>

#Gradle

// https://mvnrepository.com/artifact/org.apache.commons/commons-lang3
compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.9'

 

위 코드를 추가해서 사용가능합니다

 

Apache Commons Lang을 사용했을 경우 NULL검사를 할 필요가 없습니다

 

#StringUtils.isEmpty() : 문자열이 빈값이거나 공백스페이스 NULL이면 TRUE 반환

String str = "";
if(StringUtils.isEmpty(str)){
}

#StringUtils.isBlank() : 문자열이 빈값이거나 NULL이면 TRUE 반환, 공백스페이스는 FALSE

String str = "";
if(StringUtils.isBlank(str)){
}

'Programming > JAVA' 카테고리의 다른 글

[JAVA] 접근 제한자  (0) 2020.12.18
[SPRING] ResultMap  (0) 2020.12.11
[JAVA] 문자열 비교  (0) 2020.11.19
[JAVA] 대소문자 변환  (0) 2020.11.19
[SPRING] Spring 구조 및 DTO, VO 개념  (0) 2020.10.07

자바에서 문자열 비교 방법은

==

equals()

equalsIgnoreCase()

이 있다

 

그 전에 기본자료형과 참조자료형에 대한 이해가 필요하다

기본자료형 : 변수가 다르더라도 값이 같으면 같은 주소를 가르킨다

참조형(래퍼클래스) : 값이 같더라도 다른 주소를 가르킨다

 

https://plone93.tistory.com/46

 

[JAVA] WrapperClass(래퍼 클래스)

#WrapperClass(래퍼 클래스) 자바 자료형은 기본타입(int, char, boolean..)과 참조타입(class, interface)와 같은 객체 구분된다 기본타입을 객체처럼 다루기 위해서 사용하는 것이 래퍼 클래스 이다 #특징 기

plone93.tistory.com

 

 

# == (등위연산자) : 주소값을 비교한다

String str1 = "ABCDE"; //기본 자료형
String str2 = "ABCDE";

String str3 = new String("ABCDE"); //참조형
String str4 = new String("ABCDE");

//== : 주소를 비교
if(str1 == str2) // TRUE, 기본자료형은 값이 같으면 같은 주소를 가르킨다
if(str1 == str3) // FALSE, 참조형은 값이 같더라도 다른 주소를 가르킨다

 

# equals() : 값을 비교한다, 대소문자 구분함

String str1 = "ABCDE"; //기본 자료형
String str2 = "ABCDE";

String str3 = new String("ABCDE"); //참조형
String str4 = new String("ABCDE");

//equals : 값을 비교
if(str1.equals(str2)) // TRUE, 같은 주소, 같은 값
if(str1.equals(str3)) // TRUE, 다른 주소, 같은 값

 

# equalsIgnoreCase(): 값을 비교한다, 대소문자 구분 안함

String str1 = "ABCde"; //기본 자료형
String str2 = "abcDE";

String str3 = new String("ABCde"); //참조형
String str4 = new String("abcDE");

//equalsIgnoreCase : 값을 비교, 대소문자 구분 안함
if(str1.equalsIgnoreCase(str2)) // TRUE, 같은 주소, 같은 값
if(str1.equalsIgnoreCase(str3)) // TRUE, 다른 주소, 같은 값

'Programming > JAVA' 카테고리의 다른 글

[SPRING] ResultMap  (0) 2020.12.11
[JAVA] 빈 문자열, NULL 다루기  (0) 2020.11.19
[JAVA] 대소문자 변환  (0) 2020.11.19
[SPRING] Spring 구조 및 DTO, VO 개념  (0) 2020.10.07
[JAVA] WrapperClass(래퍼 클래스)  (0) 2020.10.04

자바  대소문자로 변환하는 내장함수로는

변수명.toUpperCase : 대문자 변환

변수명.toLowerCase : 소문자 변환

이 있다

 

#대문자 변환

String str = "abcde";
String resultStr = str.toUpperCase(); //대문자로 변환
System.out.println(resultStr); //출력, ABCDE


String str = "abCDe";
String resultStr = str.toUpperCase(); //대문자로 변환
System.out.println(resultStr); //출력, ABCDE

#소문자로 변환

String str = "ABCDE";
String resultStr = str.toLowerCase(); //소문자로 변환
System.out.println(resultStr); //출력, abcde


String str = "AbcDE";
String resultStr = str.toLowerCase(); //소문자로 변환
System.out.println(resultStr); //출력, abcde

'Programming > JAVA' 카테고리의 다른 글

[JAVA] 빈 문자열, NULL 다루기  (0) 2020.11.19
[JAVA] 문자열 비교  (0) 2020.11.19
[SPRING] Spring 구조 및 DTO, VO 개념  (0) 2020.10.07
[JAVA] WrapperClass(래퍼 클래스)  (0) 2020.10.04
[JAVA] 정규표현식  (0) 2020.10.01

DTO와 VO는 같은 개념으로 쓰이고 있지만 자세하게는 역할이 다르다

 

DTO는 DB에서 검색할 조건을 넣는 Bean이고

VO는 DB로부터 반환해서 받아오는 Bean이다

 

하나의 Bean에 반환데이터와 검색조건을 넣고 처리하면

검색조건이 반환값에 덮어써져버려서 결과가 변하기 때문

 

또 다른 이유는

DTO는 DB의 검색조건을 관리하는 Bean이기 때문에

DB의 컬럼명과 일치해야하지만

 

Bean은 반환값을 보관하기 때문에

DB명과 일치하지 않는 경우도 있다

예를들면 DB는 슈퍼_아이스크림 인데 

꺼내서 쓸땐 슈퍼_를 제외한 아이스크림이라는 이름으로 관리하는 경우가 생긴다

 

SELECT
	SUPER_ICECREAM AS ICECREAM
FROM
	TABLE
WHERE
	SUPER_ICECREAM = ?

이럴 경우 조건문과 반환값을 받는 Bean을 한개의 Bean으로 관리하면

아이스크림이라는 목록이 2개가 존재하게 되므로 관리가 복잡해진다

 

 

#설명

스프링으로 설명을 하나 스트러츠에서도 동일하다

 

로직은 컨트롤러>서비스>매퍼>QUERY 순이다

 

컨트롤러

아래는 boardId가 자유게시판, 검색키워드가 "안녕" 이라는 조건에 부합하는 리스트를 가져오는 구조

DTO는 DB에 접속해 데이터를 가져오는 쓰는 조건변수가 들어 있는 Bean이다

LIst<BoardVO> boardList 의 boardVO는 DB의 결과를 받아오는 Bean

@Controller
public class BoardController {
	
	@Autowired//객체생성을 스프링이 해줌
	BoardService boardService;
	
	@RequestMapping(value = "/boardList", method = RequestMethod.GET)//method가 GET이면서 url이 boardList
	public String boardList(BoardDTO boardDTO,//인수에 Bean을 작성하면 넘어오는 데이터들이 Bean에 있는 멤버필드에 있는 변수이름에 맞게 자동으로 들어감
							Model model) {
		String url = "/board/board_list";
        		
		boardDTO.setBoardId("FREEBOARD");
		boardDTO.setKeyword("안녕");
		
		List<BoardVO> boardList = boardService.selectBoardList(boardDTO);//서비스에서 리스트를 받아옴
		model.addAttribute("boardList", boardList);//boardList 객체를 boardList라는 이름으로 프론트에 보냄

		return url;
	}
 }

 

서비스

public interface BoardService {
	public List<BoardVO> selectBoardList(BoardDTO boardDTO);
}
@Service
public class BoardServiceImpl implements BoardService{
	
	BoardMapper boardMapper;

	@Override
	public List<BoardVO> selectBoardList(BoardDTO boardDTO) {
		return boardMapper.selectBoardList(boardDTO);
	}

}

 

매퍼

@Mapper//mybatis or ibatis가 추가되야 사용가능
public interface BoardMapper {
	public List<BoardVO> selectBoardList(BoardDTO boardDTO);
}

매퍼.xml

아래의 boardId에는 컨트롤러에서 입력한 FREEBOARD가 있고

keyword에는 "안녕" 이 있다

 

즉 boardId가 자유게시판이고 자유게시판 글 중에서 제목이나 본문에 안녕이 있는 글을 출력하는 쿼리다

그리고 resultType에서 지정한 BoardVO로 반환을 한다

<?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="com.example.demo.mapper.BoardMapper"><!-- mapper의 위치를 지정 -->

	<select id="selectBoard" resultType="com.example.demo.entity.BoardVO"><!-- 리턴 타입은 BoardVO -->
		SELECT 
			* 
		FROM 
			EXAMSITE
		WHERE	
			BOARDID = #{boardID} <!-- boardId가 DTO의 boardID이면서 -->
			AND (BOARDTITLE = '%'||#{keyword}||'%' OR BOARDCONTENT = '%'||#{keyword}||'%') <!-- 제목이나 본문에 DTO의 keyword가 있다면 -->
	</select>
	
</mapper>

 

그럼 컨트롤러에 있는 List<BoardVO>에 들어가게 되는 로직

List<BoardVO> boardList = boardService.selectBoardList(boardDTO);//서비스에서 리스트를 받아옴

 

전체적인 설명글이지만

DTO는 프론트나 컨트롤러에서 입력된 DB에서 조건 검색을 하기위한 Bean

VO는 DB에서 쿼리를 돌리고 나온 결과를 담는 Bean이라고 이해하면 된다

 

 

아래는 스트러츠 프레임워크로 위 조건이 몇개 검색 됐는지 Count를 구하는 로직

package Study;

import java.sql.PreparedStatement;
import java.util.ArrayList;
import java.util.List;

public class DAOStudy {
	public static int selectListCount(DBConection DBCon, boardDTO boardDTO) throws SQLException, Exception {

		/* SQL */
		StringBuffer buf = new StringBuffer();
		buf.append(" SELECT  ");
		buf.append(" 	COUNT(*)  ");
		buf.append(" FROM  ");
		buf.append(" 	EXAMSITE ");
		buf.append(" WHERE	 ");
		buf.append(" 	BOARDID = #{boardID} ");
		buf.append(" 	AND (BOARDTITLE = '%'||?||'%' OR BOARDCONTENT = '%'||?||'%') ");
		  

                /* 파라메터 */
                List<Object> param = new ArrayList<Object>();
                param.add(boardDTO.getBoardId());
		param.add(boardDTO.getKeyword());

		
		int resultCount = 0;
        
		try(PreparedStatement preState = DBCon.getPrepareStatement(buf.toString());){
			DBCon.setPrepareParameter(param, preState);
            
			String logSQL = StringConvertUtil.getPreparedSQL(buf.toString(), param);
			resultCount += preState.executeUpdate();

		}

		return resultCount;
	}
}

'Programming > JAVA' 카테고리의 다른 글

[JAVA] 문자열 비교  (0) 2020.11.19
[JAVA] 대소문자 변환  (0) 2020.11.19
[JAVA] WrapperClass(래퍼 클래스)  (0) 2020.10.04
[JAVA] 정규표현식  (0) 2020.10.01
[JAVA] JUnit  (0) 2020.09.25

#WrapperClass(래퍼 클래스)

자바 자료형은 기본타입(int, char, boolean..)과 참조타입(class, interface)와 같은 객체 구분된다

기본타입을 객체처럼 다루기 위해서 사용하는 것이 래퍼 클래스 이다

 

기본자료형 : 변수가 다르더라도 값이 같으면 같은 주소를 가르킨다

참조형(래퍼클래스) : 값이 같더라도 다른 주소를 가르킨다

 

#기본 자료형 특징

  • 변수명이 다르더라도 값이 같으면 주소가 같다
  • NULL을 사용할 수 없다
  • 기본 자료형 끼리 비교할 때는 ==를 사용(주소 비교)

 

#래퍼클래스 특징

  • 기본자료형은 NULL이 허용되지 않지만 래퍼 클래스는 NULL이 허용된다
  • 래퍼클래스는 특정 기능을 하는 메서드를 사용할 수 있다
  • 래퍼클래스끼리는 객체이므로 .equals()를(값 비교) 사용해서 비교한다
  • 기본자료형과 다르게 값이 같더라도 주소가 다름
  • NULL이 허용되지 때문의 NullPointExcetion에 주의해야 한다
package Study;

public class WrapperClassStudy {

	public static void main(String[] args) {
		int a = null;//에러
		Integer aa = null;//정상

		Integer i = 10;
		int ii = 10;
		
		System.out.println(i.hashCode());
		System.out.println(i.byteValue());
		System.out.println(i.floatValue());
		
		Boolean b = true;
		System.out.println(b.booleanValue());
		System.out.println(b.compareTo(b));
		
		Character c = 'a';
		char cc = 'a';
		System.out.println("CCCCCCCCC");
		System.out.println(c.charValue());
		System.out.println(c.toString());
	}

}

 

#래퍼 클래스 종류

기본타입(primitive type) 래퍼 클래스(wrapper class)
byte Byte
char Character
int Integer
float Float
double Double
boolean Boolean
long Long
short Short
String String()

 

 

#래퍼클래스를 사용해야 할 때

래퍼클래스는 NULL이 허용된다

 

기본형 int 타입으로 null을 받게되면 0이 저장되어서 설계의도와 달라질 수도 있다

 

프론트에서 서버로 데이터를 넘길때 프론트 쪽에 null이 있는데 Bean의 데이터 타입을 기본형으로 작성하면

0이 받아지게되어 설계의도와 달라진다

또한, DB에 액세스 해서 데이터를 가져올때 DB에 null이 있는데 데이터 타입이 기본형인 Bean으로 받게되면

0이 들어가서 이 또한 설계의도와 달라진다

(로직은 null검사를 하는데  0이 들어 있어서 오류가 통과되버림)

 

#예시

DB값은 null이지만 Bean에서 int로 받아버리니 자동으로 0이 들어가버려서 DB와 달라진다

 

Bean에서 Integer로 받으니 DB값 그대로 null이 출력되는 것을 알 수 있다

 

그렇기 때문에 현업에서는 현장에 따라 다르지만

DB에 액세스할 때 사용하는 Bean, model Request(받기), Response(보내기)을 할때는 래퍼클래스로 작성을 한다

 

#사용 예제

package Study;

public class WrapperBean {
	private Integer boardNumber; //게시글 번호
	private String boardId;  //게시글 id
	private String boardTitle; //게시글 제목
	private String content; //내용
	private Integer upCount; //추천 카운트
	private Integer downCount; //비추천 카운트
	private Integer reportCount; //신고 카운트
}
package Study;

public class WrapperBean {
	private int boardNumber; //게시글 번호,  기본형인 int는 null처리를 못함
	private String boardId;  //게시글 id
	private String boardTitle; //게시글 제목
	private String content; //내용
	private int upCount; //추천 카운트
	private int downCount; //비추천 카운트
	private int reportCount; //신고 카운트
}
	@GetMapping("/viewBoard")
	public String boardInsert(@RequestParam("boardNumber")Integer boardNumber) {
		String url = "";//이동할 페이지
		
		return url;
	}

 

#박싱, 언박싱

  • 박싱 : 기본타입을 래퍼 클래스로 변환하는 작업
  • 언박싱 : 래퍼 클래스를 기본타입으로 변환하는 작업
Integer num = 10;
int count = num;//언박싱, Integer > int
Integer num2 = count;//박싱, int > Integer

 

#기본타입과 래퍼클래스의 비교

//래퍼클래스
Integer I = new Integer(10);
Integer II = new Integer(10);
//기본타입
int i = 10;
int ii = 10;
		
System.out.println("기본 == 기본" + (i == ii));
System.out.println("래퍼 == 래퍼" + (I == II));
System.out.println("래퍼 == 기본" + (I == i));
System.out.println("래퍼.equals(기본)" + I.equals(i));
System.out.println("래퍼.equals(래퍼)" + I.equals(II));

'Programming > JAVA' 카테고리의 다른 글

[JAVA] 대소문자 변환  (0) 2020.11.19
[SPRING] Spring 구조 및 DTO, VO 개념  (0) 2020.10.07
[JAVA] 정규표현식  (0) 2020.10.01
[JAVA] JUnit  (0) 2020.09.25
[lombok] 롬복 설치 방법  (0) 2020.09.23

+ Recent posts