여러행함수 : Group by절, Having절

[ITWILL : JSP]JDBC활용 - DB에서 고객정보를 불러와서 HTML테이블에 담기

ITWILL학원 : 20강 JSP기초 BY 정규태강사

JDBC

  1. JDBC활용 - import쓰는 이유, form페이지로 받은 데이터를 DB에 insert하는 방법
  2. JDBC활용 - JAVA에서 DB 정보 지우기 2가지방법
  3. JDBC활용 - DB에서 고객정보를 불러와서 HTML테이블에 담기
  4. JDBC활용 - TIMESTAMP주의점, JDBC에서 데이터처리
  5. JDBC활용 - 회원정보수정페이지만들기
  6. JDBC활용 - 회원목록출력하는데 관리자는 빼고 출력하기, 자바 에러 두종류

DB저장되어있는 모든 회원정보를 출력하는 코드를 작성해보자.

1. recordset과 resultset

  • recordset = select 구문의 결과. BOF부터 EOF(End Of File)까지의 총 덩어리를 의미.

https://www.xylos.com/en/learning/blog/tip-5-save-time-processing-data-excel-vba-recordset

  • resultset = 테이블을 의미. ex)테이블A, 테이블B, 테이블C 각각이 다 resultset이다.

  • rs.next() = 커서객체를 다음(next)로 넘기는 메서드. row에 데이터가 있으며 true이고 없으면 다음 row로 내려간다. 데이터에 행이 없으면 False가 되고 while문이 종료된다.

  • getString(columnIndex)는 columnIndex안에 테이블의 열번호를 넣으면 된다.

    • 가독성이 떨어지고 모든 열이 어떤 데이터인지 알고있을때 사용할 수있다.
    • 따라서 index값을 사용하는 경우 주석을 적어 무엇을 나타내는 데이터인지 알려주는 것이 좋다.

2. DB에서 고객정보를 불러와서 테이블에 담기.

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
31
32
<table border="1">
<tr>
<td>인덱스</td>
<td>이름</td>
<td>성별</td>
<td>나이</td>
<td>주민번호</td>
</tr>
<%//1.변수설정
%>
<% //2. 드라이버 로드와 DB연결
final String DRIVER = "com.mysql.jdbc.Driver";
final String DBURL = "jdbc:mysql://localhost:3306/jspdb";
final String DBID = "root";
final String DBPW = "1234";

Class.forName(DRIVER);
Connection con = DriverManager.getConnection(DBURL, DBID, DBPW);

//3.쿼리작성
String sql = "select * from itwill_member";
PreparedStatement pstmt = con.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();

//3-1.일반출력
/* while(rs.next()){
System.out.println("이름 : " + rs.getString("name") //이름만 출력
+ ", 성별 : " + rs.getString("gender")
+ ", 나이 : " + rs.getInt("age")
+ ", 주민번호 : " + rs.getString("jumin"));
//이름, 나이, 성별, 주민번호 -> 콘솔로 출력하기 -> html 테이블생성해서 출력하기
}*/

2-1. 테이블에 출력

가져온 데이터를 테이블형태로 출력해보는데 2가지 방법이 있다.

  1. 변수지정없이 바로 while반복문실행
    SQL구문작성시 select * from itwill_member이라서 while반복문을 사용했다.
    만약 SQL구문이 select * from itwill_member where id=?로 where조건절을 추가하면 반복문이 아닌 if문으로 사용가능하다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//3.쿼리작성
String sql = "select * from itwill_member";
PreparedStatement pstmt = con.prepareStatement(sql);

ResultSet rs = pstmt.executeQuery();

while(rs.next()){
%>
<tr>
<td><%=rs.getString(1) %></td> //인덱스
<td><%=rs.getString("name") %></td>
<td><%=rs.getString("gender") %></td>
<td><%=rs.getInt("age") %></td>
<td><%=rs.getString("jumin") %></td>
</tr>
<%
}
%>

</table>
  1. 변수에 저장해서 반복문없이 table에 바로 태그집어넣기
    rs에서 가져온 값을 변수로 저장해서 html table태그에 바로 표현식으로 집어넣을 수 있다.
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
31
32
33
34
35
36
37
38
39
40
//3.쿼리작성
String sql = "select * from itwill_member where id=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);

ResultSet rs = pstmt.executeQuery();

String name = "";
int age = 0;
String gender = "";
String email = "";
Timestamp reg_date = null; //null이 초기값임

if(rs.next()){
//id=rs.getString("id"); 세션으로 가져와서 필요없음
name = rs.getString("name");
age = rs.getInt("age");
gender = rs.getString("gender");
email = rs.getString("email");
reg_date = rs.getTimestamp("reg_date");
}
%>
<table border=1>
<tr>
<td>아이디</td>
<td>이름</td>
<td>나이</td>
<td>성별</td>
<td>이메일</td>
<td>가입일자</td>
</tr>
<tr>
<td><%=id %></td>
<td><%=name %></td>
<td><%=age %></td>
<td><%=gender %></td>
<td><%=email %></td>
<td><%=reg_date %></td>
</tr>
</table>

[ITWILL : JSP]JDBC활용 - TIMESTAMP주의점, JDBC에서 데이터처리

ITWILL학원 : 20강 JSP기초 BY 정규태강사

JDBC

  1. JDBC활용 - import쓰는 이유, form페이지로 받은 데이터를 DB에 insert하는 방법
  2. JDBC활용 - JAVA에서 DB 정보 지우기 2가지방법
  3. JDBC활용 - DB에서 고객정보를 불러와서 HTML테이블에 담기
  4. JDBC활용 - TIMESTAMP주의점, JDBC에서 데이터처리
  5. JDBC활용 - 회원정보수정페이지만들기
  6. JDBC활용 - 회원목록출력하는데 관리자는 빼고 출력하기, 자바 에러 두종류

1. MySQL Workbench에서 Timestamp 추가시 주의점

MySQL Workbench에서 row추가시 Timestamp 데이터타입을 쓰고싶다면 TIMESTAMP라고 직접 작성하거나 드롭다운리스트에서 TIMESTAMP()을 찾은 뒤 꼭 괄호를 삭제하고 TIMESTAMP로 apply해야 에러가 발생하지 않는다.

타임스탬프는 사용자가 입력하는 데이터가 아니라 컴퓨터시간에서 가져오는 데이터이다.
따라서 JDBC의 3단계인 sql구문 & DB저장에서 객체생성을 통해 진행할 수 있다.

아래 코드는 JDBC에서 itwill_member테이블에 사용자가 입력한 id, pw와 컴퓨터현재시간을 차례대로 sql구문에 넣는 코드이다.

1
2
3
4
5
6
//3. sql구문 & DB저장 진행시 
String sql = "insert into itwill_member value(?,?,?)";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, id);
pstmt.setString(2, pw);
pstmt.setTimestamp(3, new Timestamp(System.currentTimeMillis()));

2. JDBC에서 데이터처리

JDBC 3단계인 SQL작성 & pstmt 객체생성 & 데이터처리를 중점으로 로그인페이지를 작성해보자.

  • 아이디 일치 + 비번일치 => 로그인, main페이지이동, id값 세션객체 생성
  • 아이디 일치 + 비번불일치 => 에러(“비밀번호오류”), 뒤로가기
  • 아이디 불일치 => 에러(“비회원입니다”), 뒤로가기
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
31
32
33
34
35
36
37
38
39
//3-3. 데이터처리
if(rs.next()){ //true라는 건 id가 있다는 소리임 즉, 회원인 경우가 됨
if(pw.equals(rs.getString("pw"))){ //비번일치
//세션ID값생성
session.setAttribute("id", id);
response.sendRedirect("main.jsp"); //js코드보다 java코드가 좋다
System.out.println(id+"로그인성공");
%>
<!-- <script type="text/javascript">
location.href="main.jsp"
</script> js코드보다 java코드가 더 좋다 -->
<%
}else{
System.out.println("비밀번호오류"); //비번불일치
%>
<script type="text/javascript">
alert("비밀번호가 일치하지 않습니다")
//페이지이동 3가지의 차이점
history.back(); //=>작성한 아이디나 데이터가 살아있다
//location.href="loginForm.jsp" //=>작성한 아이디나 데이터가 없다
//location.reload();//=>새로고침으로 alert창이 반복된다
</script>
<%
}
}else{ //false이므로 id가 없다는 소리임. 즉, 비회원인 경우.
System.out.println("아이디오류-비회원입니다");
%>
<script type="text/javascript">
let tmp = confirm("비회원입니다. 회원가입하시겠습니까?")
if(tmp){
location.href="insertForm.jsp";
}else{
history.back();
}

</script>
<%
}
%>

2-1. 페이지이동시 js코드보다 java코드가 좋은 이유

다른 페이지로 이동시 왜 js코드보다 java코드가 더 좋을까?
해당파일의 확장자는 jsp이다. jsp파일이라서 자바코드의 처리가 우선순위에 있다.
js코드인 경우, java로 된 코드가 다 실행되고 난 뒤에 실행이 된다.
이때 이후에 나오는 java코드에 문제가 생기면 js코드가 실행안될 수 있기때문에 아예 java코드를 쓰는것이
실행순서상 좋다.

  1. js코드를 이용한 페이지이동
1
2
3
<script type="text/javascript">
location.href="main.jsp"
</script> -->
  1. java코드를 이용한 페이지이동
1
response.sendRedirect("main.jsp");

2-2. 페이지새로고침 3가지의 차이점.

  • history.back(); : 작성한 아이디나 데이터가 살아있다
  • location.href="loginForm.jsp"; : 작성한 아이디나 데이터가 없다
  • location.reload(); : 새로고침으로 alert창이 반복된다

[ITWILL : JSP]JDBC활용 - import쓰는 이유, form페이지로 받은 데이터를 DB에 insert하는 방법

ITWILL학원 : 19강 JSP기초 BY 정규태강사

JDBC

  1. JDBC활용 - import쓰는 이유, form페이지로 받은 데이터를 DB에 insert하는 방법
  2. JDBC활용 - JAVA에서 DB 정보 지우기 2가지방법
  3. JDBC활용 - DB에서 고객정보를 불러와서 HTML테이블에 담기
  4. JDBC활용 - TIMESTAMP주의점, JDBC에서 데이터처리
  5. JDBC활용 - 회원정보수정페이지만들기
  6. JDBC활용 - 회원목록출력하는데 관리자는 빼고 출력하기, 자바 에러 두종류

1. import는 언제, 왜 쓸까?

어떤 건 import를 쓰고 어떤 건 import하지않고도 사용가능하다.

왜그럴까?

  1. import가 필요없는 경우 : 기본적으로 사용 가능한 클래스인 경우이다.

    • 직접구현해서 접근가능한 범위에서 만들어 놓은 클래스들
    • java 활용도가 높은 클래스를 패키지 추가 없이 사용가능하도록 만들어 놓은 클래스들
      • 예 ) java.lang.*은 자바에서 제공하는 기본패키지로 import없이 사용가능하다. 대표적으로 String 객체는 java.lang.*에 속해있다.
  2. import를 써야하는 경우 : 기본제공되는 클래스가 아닌 경우 클래스가 있는 패키지를 추가(import)해야함

2. form페이지로 받은 데이터를 DB에 insert하는 방법

form페이지를 만들어서 이름과 성별, 나이, 주민번호를 사용자로부터 받은 뒤 그 데이터들을 insertPro.jsp파일에서 불어와서 MySQL DB에 넣어보는 코드이다.

아래 코드는 form페이지는 생략하고 insertPro.jsp만 나타낸 코드이다.

총 3단계로 이루어진다.

  1. form페이지에서 입력한 데이터를 변수로 불러오기
  2. DB연결하기
  3. SQL구문작성 후 stmt객체생성하기 : SQL구문작성시에는 작은 따음표와 큰 따옴표를 잘 입력해야한다.
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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
//import 아래 3가지 추가됨
<%@page import="java.sql.Statement"%>
<%@page import="java.sql.DriverManager"%>
<%@page import="java.sql.Connection"%>

<%
//1. 변수로 가져오서 데이터출력

//1-1. 파라미터값 한글처리
request.setCharacterEncoding("UTF-8");

//1-2. form태그에서 받은 모든 데이터는 string타입으로 전달되므로 -> int는 형변환필수
String name = request.getParameter("name");
int age = Integer.parseInt(request.getParameter("age"));
String gender = request.getParameter("gender");
String jumin1 = request.getParameter("jumin1");
String jumin2 = request.getParameter("jumin2");
String jumin = jumin1 + "-" + jumin2;
%>

<!--1-3. 데이터출력 -->
이름 : <%=name %><br>
나이 : <%=age %><br>
성별 : <%=gender %><br>
주민번호 : <%=jumin %><br>

<%
//2. DB에 담기
//2-1. 필요한 변수들 상수로 정리
final String DRIVER = "com.mysql.jdbc.Driver";
final String DBURL = "jdbc:mysql://localhost:3306/jspdb";
final String DBID = "root";
final String DBPW = "1234";

//2-2. 드라이버로드
Class.forName(DRIVER);
System.out.println("드라이버로드성공");

//2-3. DB연결
Connection con = DriverManager.getConnection(DBURL, DBID, DBPW);
System.out.println("드라이버연결");

//3. SQL구문작성, stmt 객체생성
//3-1. SQL구문작성 : 작은따옴표와 큰따옴표 주의하기
String sql= "insert into itwill_member values(null,'"+name+"','"+gender+"',"
+age+",'"+jumin+"')";

//3-2. stmt 객체생성(java.sql하위의 statement사용) : sql구문을 실행하는 역할.
Statement stmt = con.createStatement(); //statement객체생성완료

//3-3. stmt 실행
stmt.executeUpdate(sql);
System.out.println("DB저장완료");
%>

MySQL가서 select * from 테이블명 명령어를 입력하면 row가 추가된 것을 확인할 수 있다.

3. PreparedStatement 객체생성

위의 sql구문작성을 보면 변수, 작은따옴표, 큰따옴표혼재되어있어서 적기에 매우 불편하다
이를 해소하기위한 객체PreparedStatement를 이용하면된다.

기존 Statement보다 처리속도도 빠르고 보안도 좋은 PreparedStatement를 사용해야한다.

아래 두 코드를 비교해보자.

3-1. Statement사용

1
2
3
4
5
6
7
8
9
10
11
<%@page import="java.sql.Statement"%>

//1.SQL구문작성
String sql= "insert into itwill_member values(null,'"+name+"','"+gender+"',"
+age+",'"+jumin+"')";

//2. stmt 객체생성(java.sql하위의 statement사용) : sql구문을 실행하는 역할.
Statement stmt = con.createStatement();

//3. stmt 실행
stmt.executeUpdate(sql);

3-2. PreparedStatement사용

3단계 stmt 실행시 기능에 따라 쿼리구문을 두가지로 구분할수있다.

  1. pstmt.executeUpdate() : insert, update, delete에 사용

    • DB조작하는 구문.
  2. pstmt.executeQuery() : select에 사용

    • DB조작없이 값만 사용하는 구문.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<%@page import="java.sql.PreparedStatement"%>

//1. SQL구문작성
String sql= "insert into itwill_member values(null,?,?,?,?)";

//2. pstmt 객체생성(java.sql하위의 prepareStatement사용) : sql구문을 실행하는 역할.
PreparedStatement pstmt = con.prepareStatement(sql);

//물음표 값채우기 pstmt.set테이블데이터타입(물음표위치, 값)
//항상 물음표 갯수와 쿼리구문갯수가 동일해야한다.
pstmt.setString(1, name);
pstmt.setString(2, gender);
pstmt.setInt(3, age);
pstmt.setString(4, jumin);

//3. pstmt 실행 : 업데이트 또는 쿼리
pstmt.executeUpdate();
//pstmt.executeQuery();

[ITWILL : JSP]JDBC활용 - JAVA에서 DB 정보 지우기 2가지방법

ITWILL학원 : 19강 JSP기초 BY 정규태강사

JDBC

  1. JDBC활용 - import쓰는 이유, form페이지로 받은 데이터를 DB에 insert하는 방법
  2. JDBC활용 - JAVA에서 DB 정보 지우기 2가지방법
  3. JDBC활용 - DB에서 고객정보를 불러와서 HTML테이블에 담기
  4. JDBC활용 - TIMESTAMP주의점, JDBC에서 데이터처리
  5. JDBC활용 - 회원정보수정페이지만들기
  6. JDBC활용 - 회원목록출력하는데 관리자는 빼고 출력하기, 자바 에러 두종류

JAVA에서 DB 정보 지우기

이름과 주민번호의 입력값이 DB데이터와 일치하면 회원탈퇴를 진행하는 코드를 만들어보자.

1. 사용자가 작성할 form페이지만들기

먼저 이름과 주민번호를 사용자로부터 입력받을 수 있는 deleteForm.jsp파일을 만든다

1
2
3
4
5
6
7
8
9
10
<fieldset>
<legend>회원정보수정</legend>
<form action="deletePro.jsp" method="post" name="fr">
<h3>본인확인정보</h3>
이름 <input type="text" name="name"><br>
주민번호 <input type="text" name="jumin1"> - <input type="password" name="jumin2"><br>
<p></p>
<input type="submit" value="탈퇴하기"><br>
</form>
</fieldset>

2. 사용자가 작성한 데이터를 불러와서 DB에 연결하기

  • deletePro.jsp에서 사용자데이터를 불러와서 DB데이터와 확인 후 탈퇴를 처리하는 코드를 작성하면 아래와 같다.

  • 순서는 아래와 같다

    1. 사용할 변수를 먼저 가져오기
    2. DB연결하기
    3. SQL쿼리작성하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%//1. 변수가져오기
request.setCharacterEncoding("UTF-8");
String name = request.getParameter("name");
String jumin = request.getParameter("jumin1")+"-"+request.getParameter("jumin2");
%>

<%
//2.DB연결
final String DRIVER = "com.mysql.jdbc.Driver";
final String DBURL = "jdbc:mysql://localhost:3306/jspdb";
final String DBID = "root";
final String DBPW = "1234";

Class.forName(DRIVER);
Connection con = DriverManager.getConnection(DBURL, DBID, DBPW);
%>

3. sql작성 & pstmt객체생성

이때 두가지 방법이 있다.

3-1. 바로 delete하기

  • pstmt.executeUpdate();는 return값이 int이므로 int형 변수에 넣은 뒤 if조건문을 통해 진행여부를 html페이지에서 보여줄 수 있다.

  • 사용자입력값이 DB데이터와 일치하면

    • 이클립스 console창에 실행완료(수정완료) : 1 출력
    • html파일에서는 이름과 함께 정상적으로 탈퇴되었습니다라는 문구 출력된다.
  • 사용자입력값이 DB데이터와 불일치하면

    • 이클립스 console창에 실행완료(수정실패) : 0 출력
    • html파일에서는 탈퇴실패 문구 출력된다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<%
//3. sql작성 & pstmt객체생성
String sql = "delete from itwill_member where name=? && jumin=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.setString(2, jumin);

int val = pstmt.executeUpdate();
if(val > 0){
System.out.println("실행완료(수정완료) : "+ val);
%><%=name %>님, 정상적으로 탈퇴되었습니다.<%
}else{
System.out.println("실행완료(수정실패) : "+ val);
%>탈퇴실패<%
}
%>

3-2. select 후 delete하기

  • pstmt.executeUpdate();는 return값이 int이므로 int형 변수에 넣은 뒤 if조건문을 통해 진행여부를 html페이지에서 보여줄 수 있다.

  • 사용자입력값이 DB데이터와 일치하는지 select로 확인후 일치하면

    • delete구문으로 데이터 삭제
  • 사용자입력값이 DB데이터와 일치하는지 select로 확인후 불일치하면

    • 삭제동작없이 이전페이지로 이동

DB에서 delete은 매우 신중한 작업이다.
따라서 정확한 데이터를 찾아 정확하게 처리해야하기때문에 전자보단 후자를 사용해야한다.

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
31
32
<% //3. sql작성 & pstmt객체생성
String sql = "select name jumin from itwill_member where name=?";
PreparedStatement pstmt = con.prepareStatement(sql);
pstmt.setString(1, name);

ResultSet rs = pstmt.executeQuery();
if(rs.next()){ //레코드셋에서 커서를 옮겨서 데이터가 있을 때 실행하겠다.
//이름과 주민번호가 있는 회원의 정보가 존재한다 =>삭제
if(jumin.equals(rs.getString("jumin"))){
sql = "delete from itwill_member where name=?";
pstmt = con.prepareStatement(sql);
pstmt.setString(1, name);
pstmt.execute();
System.out.println("회원삭제완료");
}else{ //이름은 있지만 주민번호가 다른 경우 =>삭제동작없이 이전페이지로 이동
%>
<script type="text/javascript">
alert("주민번호 오류")
history.back(); //뒤로가기.
</script>
<%
}
}else{
//이름에 해당하는 주민번호가 존재하지않음 => 즉,비회원이므로 삭제동작없이 이전페이지로 이동
%>
<script type="text/javascript">
alert("이름 오류")
history.back(); //뒤로가기.
</script>
<%
}
%>
MYSQL 접속순서, DB명령어, 테이블명령어, 데이터명령어
MySQL 한글깨짐현상 두가지 해결방법 : cmd와 Workbench, 이클립스와 MYSQL연결

[ITWILL : JAVA]클래스 : 매개변수위치에 따른 차이(생성자 vs 메서드), private멤버변수 getter와 setter로 가져다쓰기

ITWILL학원 : 13강 JAVA BY 윤미영강사

1. 매개변수위치에 따른 차이

클래스 Book은 책제목과, 저자, 가격을 출력해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class Book {
private String title;
private String author;
private int price;

public Book(String t, String a, int p){
title = t;
author = a;
price = p;
}

void showInfo(String title, String author, int price ){
System.out.printf("책 제목 : %s, 저자 : %s, 가격 : %,d%n", title, author, price);
}

void showInfo(){
System.out.printf("책 제목 : %s, 저자 : %s, 가격 : %d%n", title, author, price);
}

클래스 TestBook 이라는 새로운 클래스파일을 만들고 메인메서드를 실행해보자.

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class TestBook {
public static void main(String[] args) {

//생성자파라미터를 통해서 값입력
Book book1 = new Book("운동하는여자", "양민영", 25000);
Book book2 = new Book("채식주의자", "한강", 13500);

//파라미터메서드를 통해서 값입력
Book book3 = new Book();
book3.showInfo("머니", "롭무어", 28000);

//배열생성
Book[] books = new Book[4];

//파라미터가 있는 배열값 넣는 방법2가지

//첫번째방법 : new 이용
books[0] = new Book("며느라기", "수신지", 50000);
//두번째방법 : 객체대입
books[1] = book1;
books[2] = book2;
books[3] = book3;


//배열의 모든값 출력하는 두가지방법
//for문 사용
for(int i=0; i<books.length; i++){
books[i].showInfo();
}

//for each문사용
for(Book b: books){
b.showInfo();
}
}
}
//출력값
책 제목 : 머니, 저자 : 롭무어, 가격 : 28,000

책 제목 : 며느라기, 저자 : 수신지, 가격 : 50000
책 제목 : 운동하는여자, 저자 : 양민영, 가격 : 25000
책 제목 : 채식주의자, 저자 : 한강, 가격 : 13500
책 제목 : null, 저자 : null, 가격 : 0

책 제목 : 며느라기, 저자 : 수신지, 가격 : 50000
책 제목 : 운동하는여자, 저자 : 양민영, 가격 : 25000
책 제목 : 채식주의자, 저자 : 한강, 가격 : 13500
책 제목 : null, 저자 : null, 가격 : 0

1-1 null값이 나오는 이유?

보이는 것처럼 생성자파라미터를 통해서 입력한 값들은 제대로 출력되지만 파라미터메서드를 통해서 입력한 값들은 null로 출력된다.

  • WHY?
    메서드는 파라미터의 값을 받았는데 넣어줄 곳이 없기때문에!

  • 그렇다면 메서드를 어떻게 바꾸면 될까?
    멤버변수를 파라미터값을 대입할수있게 코드를 추가해주면된다

1
2
3
4
5
6
void showInfo(String title, String author, int price ){
this.title = title;
this.author = author;
this.price = price;
System.out.printf("책 제목 : %s, 저자 : %s, 가격 : %,d%n", title, author, price);
}

1-2 어떤 방법이 좋은걸까?

생성자에 파라미터를 받는 방법과 메서드에 파라미터를 받아서 하는 방법 중 어느것이 더 좋은 것일까?

  1. 생성자파라미터
1
2
3
4
5
6
7
8
//1-1.생성자파라미터 생성
public Book(String t, String a, int p){
title = t;
author = a;
price = p;
}
//1-2.생성자파라미터 출력
Book book1 = new Book("운동하는여자", "양민영", 25000)
  1. 파라미터메서드
1
2
3
4
5
6
7
8
9
10
11
//2-1.파라미터메서드 생성
void showInfo(String title, String author, int price ){
this.title = title;
this.author = author;
this.price = price;
System.out.printf("책 제목 : %s, 저자 : %s, 가격 : %,d%n", title, author, price);
}

//2-2. 메서드 출력
Book book1 = new Book();
book3.showInfo("운동하는여자", "양민영", 25000);

둘 다 기능은 동일하지만 생성자파라미터를 쓰는 것이 더 좋다

  • WHY?
    생성자의 기능과 메서드의 기능에 맞게 충실하게 하는 것이 좋기때문이다
    생성자의 기능은 변수를 초기화하는 것이다.
    메서드는 이름에서도 알수있듯이 showInfo()이다. 하지만 파라미터메서드를 생성하면 변수도 초기화하고 출력까지하는 두가지 짬뽕기능을 가지게 된다.

  • 따라서 기능에 맞게 나눠서 코딩하는 것이 좋은 개발습관이다.

2. private 멤버변수값을 사용하는 방법

  • DAO : 주로 jsp model1에서 사용

  • DTO(Data Transfer Object) : 데이터가 포함된 객체를 한 시스템에서 다른 시스템으로 전달하는 작업을 처리하는 클래스이다.

    • 즉, 객체에서 정보가 중요하다. 즉 멤버변수가 중요한 클래스.
    • 정보전달이 중요한 DTO타입의 클래스들은 값을 생성해주는 getter, setter메서드를 만들어야한다
    • 자바빈으로 불리기도 함.
    • 주로 jsp model2에서 사용
    • vs 기능이 중요한 클래스, 라이브러리가 중요한 변수
  • VO(Value Object)

    • DTO와 비슷한 개념
    • 주로 스프링이용할때 사용
  • 멤버변수는 private을 설정하는 것이 데이터보안상 좋다.
    하지만 private을 쓰게되면 다른 클래스에서 가져가 쓸 수가 없다.
    이럴때 아래 두가지 메서드를 이용한다(개발자들의 약속이다).

2-1. getter메서드와 setter메서드

  • 멤버변수의 특정한 값을 가져오고 싶을땐 get멤버변수명().
  • 멤버변수의 특정한 값을 설정하고싶을땐 set멤버변수명().

이를 getter와 setter라고 부른다.

  • Getters and Setters 단축키 : Alt + Shift + S -> R
    • 또는 source탭 Generate Getters and Setters 클릭

2-2. getter와 setter 사용하는 방법

  • getter와 setter 사용하는 코드
1
2
3
4
5
6
//메인메서드안에서 get메서드쓰는 방법
System.out.println(book1.getTitle()); //값가져오기

//메인메서드안에서 set메서드쓰는 방법
book1.setPrice(20000); //값설정
System.out.println(book1.getPrice()); //값가져오기

2-3. getter와 setter 예시

Book 클래스파일은 아래와 같다.
제목과 저자 가격을 멤버변수로 가지고 있다.

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
31
32
33
34
public class Book {
private String title;
private String author;
private int price;

public Book(String t, String a, int p){
title = t;
author = a;
price = p;
}

void showInfo(){
System.out.printf("책 제목 : %s, 저자 : %s, 가격 : %d%n", title, author, price);
}

String getTitle(){
return title;
}
String getAuthor(){
return author;
}
int getPrice(){
return price;
}
void setTitle(String title){
this.title = title; //매개변수명과 멤버변수명이 같을때 this를 통해 멤버변수를 지정해줄수있다.
}
void setAuthor(String a){
author = a; //매개변수명과 멤버변수명이 다른경우 그냥 쓰면 된다.
}
void setPrice(int p){
price = p;
}
}

매개변수명과 멤버변수명이 같을때 this를 통해 멤버변수를 지정해줄수있다.

실행하는 메인메서드파일은 아래와 같다.

1
2
3
4
5
6
7
8
Book book1 = new Book("운동하는여자", "양민영", 25000);
System.out.println(book1.getTitle());
book1.setPrice(20000);
System.out.println(book1.setPrice());

//출력값
운동하는여자
20000