static을 사용하면 클래스이름.메소드이름으로 사용할 수 있다. 어디서든 사용 가능하다. 이를 클래스 메소드라 한다.

static을 사용하지 않으면 클래스를 하나의 객체로 인스턴스화 한 다음 객체.메소드이름으로 사용해야한다. 이를 인스턴스 메소드라 한다.

 

인스턴스 메소드 (static X)

이게 무슨 말이냐면, 아까 HomeController에 만들었던 isIntegerString 메소드를 DB 클래스로 옮기고, HomeController에서는 isIntegerString 메소드를 지워보자. 물론, private는 public으로 바꿔준다.

DB.java

public class DB<T> {
	// String이 숫자로 형변환이 가능한지 아닌지를 검사하는 메소드
	public boolean isIntegerString(String numericString) {
		try {
			int result = Integer.parseInt(numericString);
			return true;
		} catch (Exception e) {
			
		}
		return false;
	}
}

 

HomeController

static을 사용하지 않을 경우 HomeController에서 해당 메소드를 사용하기 위해서는 기존 방법과 같다.

@Controller
public class HomeController {
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {

		DB db = new DB<Student>(".../student.db", "student");
		db.isIntegerString(numericString);
		
	}
}

 

클래스 메소드 (static O)

DB.java

public class DB<T> {
	// String이 숫자로 형변환이 가능한지 아닌지를 검사하는 메소드
	public static boolean isIntegerString(String numericString) {
		try {
			int result = Integer.parseInt(numericString);
			return true;
		} catch (Exception e) {
			
		}
		return false;
	}
}

 

HomeController

@Controller
public class HomeController {
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) {

		DB.isIntegerString(numericString);
		
	}
    // 여기서는 사용할 수 없다. 클래스 내부에 메소드를 만들고, 그 메소드 안에서 사용 가능하다.
}

이렇게 DB클래스에 있는 메소드에 직접 접근이 가능하다.

따라서, HomeController에 있는 insert 방법 2는 다음과 같이 바꾸면 된다.

	// 데이터 입력하기. if를 사용한 잘못된 파라미터 체크 & 문자열 숫자 형변환 가능 여부 검사하는 방법.
		@RequestMapping(value = "/insert", method = RequestMethod.GET)
		public String insert(Locale locale, Model model, HttpServletRequest request) {
			try {
				request.setCharacterEncoding("UTF-8");
			} catch (UnsupportedEncodingException e) {
				e.printStackTrace();
			}
			
			DB db = new DB<Student>(".../student.db", "student");
			
			if (db.open()) {
				if (request.getParameter("name") != null &&	// 파라미터 이름이 잘못 들어온 경우에 대한 null 체크
					request.getParameter("middleScore") != null &&
					// 클래스 메소드를 사용한 숫자 형변환 검사
					DB.isIntegerString(request.getParameter("middleScore")) &&	// 숫자로 형변환 가능한지를 체크 (파라미터 이름은 정상이나 숫자로 변환이 불가능하거나 빈 값에 대한 예외처리)
					request.getParameter("finalScore") != null &&
					// 인스턴스 메소드를 사용한 숫자 형변환 검사
					db.isIntegerString(request.getParameter("finalScore")) &&
					db.insertData(new Student(request.getParameter("name"),	// 파라미터 가져오기
											  Integer.parseInt(request.getParameter("middleScore")),
											  Integer.parseInt(request.getParameter("finalScore"))))) {
					model.addAttribute("message", "새 데이터를 추가했습니다.");
				} else {
					model.addAttribute("message", "데이터 추가에 실패했습니다.");
				};
				db.close();
			} else {
				model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
			}
			
			return "message";
		}

 

그리고 가독성을 높이기 위해 if문 조건 검사를 따로 분리해보자.

	// 데이터 입력하기. if를 사용한 잘못된 파라미터 체크 & 문자열 숫자 형변환 가능 여부 검사하는 방법.
	@RequestMapping(value = "/insert", method = RequestMethod.GET)
	public String insert(Locale locale, Model model, HttpServletRequest request) {
		try {
			request.setCharacterEncoding("UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		if (request.getParameter("name") == null) {
			model.addAttribute("message", "데이터가 올바르지 않습니다.");
			return "message";
		}
		if (request.getParameter("middleScore") == null) {
			model.addAttribute("message", "데이터가 올바르지 않습니다.");
			return "message";
		}
		if (!DB.isIntegerString(request.getParameter("middleScore"))) {
			model.addAttribute("message", "데이터가 올바르지 않습니다.");
			return "message";
		}
		if (request.getParameter("finalScore") == null) {
			model.addAttribute("message", "데이터가 올바르지 않습니다.");
			return "message";
		}
		if (!DB.isIntegerString(request.getParameter("finalScore"))) {
			model.addAttribute("message", "데이터가 올바르지 않습니다.");
			return "message";
		}
		
		DB db = new DB<Student>(".../student.db", "student");
		
		if (db.open()) {
			if (db.insertData(new Student(request.getParameter("name"),	// 파라미터 가져오기
										  Integer.parseInt(request.getParameter("middleScore")),
										  Integer.parseInt(request.getParameter("finalScore"))))) {
				model.addAttribute("message", "새 데이터를 추가했습니다.");
			} else {
				model.addAttribute("message", "데이터 추가에 실패했습니다.");
			};
			db.close();
		} else {
			model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
		}
		
		return "message";
	}

 

마찬가지 방식으로 방법 1도 다음과 같이 각각 분리시킬 수 있다.

	// 데이터 입력하기. try를 사용한 잘못된 파라미터 체크 & 문자열 숫자 형변환 가능 여부 검사하는 방법. (기능별 분리)
	@RequestMapping(value = "/insert", method = RequestMethod.GET)
	public String insert(Locale locale, Model model, HttpServletRequest request) {
		try {
			request.setCharacterEncoding("UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		// 변수 선언 및 초기화
		String name = null;
		int middleScore = 0;
		int finalScore = 0;
		
		// 데이터 유효성 검사
		try {
			name = request.getParameter("name");
			middleScore = Integer.parseInt(request.getParameter("middleScore"));
			finalScore = Integer.parseInt(request.getParameter("finalScore"));
		} catch (Exception e) {
			e.printStackTrace();
			model.addAttribute("message", "데이터가 올바르지 않습니다.");
			return "message";
		}
		
		// DB에 쿼리 전송
		DB db = new DB<Student>(".../student.db", "student");
		
		if (db.open()) {
			if (db.insertData(new Student(name, middleScore, finalScore))) {
				model.addAttribute("message", "새 데이터를 추가했습니다.");
			} else {
				model.addAttribute("message", "데이터 추가에 실패했습니다.");
			};

			db.close();
		} else {
			model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
		}
		
		return "message";
	}

 

 

 

 

 

 

위 방법을 정리해보면

방법 1

	// 데이터 입력하기. try를 사용한 잘못된 파라미터 체크 & 문자열 숫자 형변환 가능 여부 검사하는 방법.
	@RequestMapping(value = "/insert", method = RequestMethod.GET)
	public String insert(Locale locale, Model model, HttpServletRequest request) {
		try {
			request.setCharacterEncoding("UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		// DB에 쿼리 전송 및 데이터 유효성 검사
		DB db = new DB<Student>(".../student.db", "student");
		
		if (db.open()) {
			try {
				String name = request.getParameter("name");
				int middleScore = Integer.parseInt(request.getParameter("middleScore"));
				int finalScore = Integer.parseInt(request.getParameter("finalScore"));

				if (db.insertData(new Student(name, middleScore, finalScore))) {
					model.addAttribute("message", "새 데이터를 추가했습니다.");
				} else {
					model.addAttribute("message", "데이터 추가에 실패했습니다.");
				};
			} catch (Exception e) {
				e.printStackTrace();
				model.addAttribute("message", "데이터가 올바르지 않습니다.");
			}

			db.close();
		} else {
			model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
		}
		
		return "message";
	}

 

방법 1 (기능별 분리)

	// 데이터 입력하기. try를 사용한 잘못된 파라미터 체크 & 문자열 숫자 형변환 가능 여부 검사하는 방법. (기능별 분리)
	@RequestMapping(value = "/insert", method = RequestMethod.GET)
	public String insert(Locale locale, Model model, HttpServletRequest request) {
		try {
			request.setCharacterEncoding("UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		// 변수 선언 및 초기화
		String name = null;
		int middleScore = 0;
		int finalScore = 0;
		
		// 데이터 유효성 검사
		try {
			name = request.getParameter("name");
			middleScore = Integer.parseInt(request.getParameter("middleScore"));
			finalScore = Integer.parseInt(request.getParameter("finalScore"));
		} catch (Exception e) {
			e.printStackTrace();
			model.addAttribute("message", "데이터가 올바르지 않습니다.");
			return "message";
		}
		
		// DB에 쿼리 전송
		DB db = new DB<Student>(".../student.db", "student");
		
		if (db.open()) {
			if (db.insertData(new Student(name, middleScore, finalScore))) {
				model.addAttribute("message", "새 데이터를 추가했습니다.");
			} else {
				model.addAttribute("message", "데이터 추가에 실패했습니다.");
			};

			db.close();
		} else {
			model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
		}
		
		return "message";
	}

 

방법 2

	// 데이터 입력하기. if를 사용한 잘못된 파라미터 체크 & 문자열 숫자 형변환 가능 여부 검사하는 방법.
	@RequestMapping(value = "/insert", method = RequestMethod.GET)
	public String insert(Locale locale, Model model, HttpServletRequest request) {
		try {
			request.setCharacterEncoding("UTF-8");
		} catch (UnsupportedEncodingException e) {
			e.printStackTrace();
		}
		
		// 데이터 유효성 검사
		if (request.getParameter("name") == null) {
			model.addAttribute("message", "데이터가 올바르지 않습니다.");
			return "message";
		}
		if (request.getParameter("middleScore") == null) {
			model.addAttribute("message", "데이터가 올바르지 않습니다.");
			return "message";
		}
		if (!DB.isIntegerString(request.getParameter("middleScore"))) {
			model.addAttribute("message", "데이터가 올바르지 않습니다.");
			return "message";
		}
		if (request.getParameter("finalScore") == null) {
			model.addAttribute("message", "데이터가 올바르지 않습니다.");
			return "message";
		}
		if (!DB.isIntegerString(request.getParameter("finalScore"))) {
			model.addAttribute("message", "데이터가 올바르지 않습니다.");
			return "message";
		}
		
		// DB에 쿼리 전송
		DB db = new DB<Student>(".../student.db", "student");
		
		if (db.open()) {
			if (db.insertData(new Student(request.getParameter("name"),	// 파라미터 가져오기
										  Integer.parseInt(request.getParameter("middleScore")),
										  Integer.parseInt(request.getParameter("finalScore"))))) {
				model.addAttribute("message", "새 데이터를 추가했습니다.");
			} else {
				model.addAttribute("message", "데이터 추가에 실패했습니다.");
			};
			db.close();
		} else {
			model.addAttribute("message", "DB파일을 사용할 수 없습니다.");
		}
		
		return "message";
	}

 

개인적으로 변수가 많지 않으면 방법 1, 변수가 많아지면 방법1 (기능별 분리)나 방법 2가 좋아보인다.

 

+ Recent posts