봉봉의 개인 블로그
2017-05-25-P 본문
아래 사진과 같이 이름도 입력하고 성별도 입력하고 기술에 대해서도 입력하면 아래 리스트에서
입력한 내용이 뜨게끔 만들것이다 긔고 뒤에 SKILL 을 여러개 입력하면 SKILL의 내용이 옆으로 뜨게끔만들것이다.
지금부터 만드는것처럼 앞으로 프로젝트를 만들도록 하여야한다.
먼저 화면을 담당하는 jsp 파일부터 살펴 보도록하자
addEmployeeForm.jsp 파일은 먼저 만들어 줍니다
그후 그안을 아래와 같이 채워줍니다.
위 사진과 같이 채워줍니다.
설명을 쫌 하자면 먼저 43번부터 64번까지를 먼저 보자면 form 태그안에서 입력한 데이터의 내용을 다시 addEmployeeForm.jsp 로 보내줍니다 그걸 받은값을 이제 다시 보내는 것이므로 위에 19~40번까지에서 그 내용을 받아줍니다 먼저 20번 줄에서와 같이 EmployeeService클래스 타입으로 employeeservice 객체참조변수를 선언하고 EmployeeService생성자 메서드를 통해서 생성된 객체의 주소값을 employeeservice객체 참조변수에 할당합니다
그후 String 타입으로 각각의 employeeName,employeeGender 선언하고 String[] 타입으로 skillName 선언해줍니다. 그다음 24,25번에서와 같이 getParameter 를통해서 입력한 값을 받아줍니다 (이름 , 성별) 그후 여러개의 SKILL을 받기 위해서 String[] 타입으로 선언된 skillname 안에 입력한 값을 getParameterValues을통해서 배열의 형태로 받아줍니다(배열을 받을 때는 getParameterValues 로 받아야합니다)
그후 27번에서 ArrayList<Employee> 타입으로 선언된 변수 list 안에 employeeservice주소값을 찾아가서 그안에
Employeeselect 메서드를 실행하고 리턴받은 값을 list 변수안에 할당해줍니다.
그리고 만약 employeeName,employeeGender 값이 null 이 아닐경우 if 문이 실행됩니다.만약아니라면 else 문이 실행되고 만약 if 문이 실행되고 만약 skillName 의 값이 null 이면 if 문안에 employeeservice주소값 안에 emplistinsert 메서드를 호출합니다 호출시 매개변수 값으로 employeeName(String) 값과 employeeGender(String) 가 매개변수 값으로 입력되어 메서드가 호출됩니다.
만약 skillName 값이 null 이 아닐경우employeeservice 주소값안에 Employeeinsert 메서드가 호출되고 호출시 매개변수 값으로 employeeName(String) 과 employeeGender(String) 과 skillName(String[])의 값을 매개변수 값으로 받아 메서드가 호출됩니다.
그리고 72~85번까지의 문에서는 위에 27번문에서의 값을 받아와서 list를 화면에 출력하는 역활을 합니다
72번문안에서 먼저 tbody의 내용을 반복하여 출력하는데 list 안에 담긴 배열의 숫자만큼 출력합니다
그후 77번에서의 if 문을에서 만약 list.get(i)번째 안에 getSkill()(이건 배열의 형태이다 즉 ArraryList 안에 ArraryList가 있는것이다)이 null 이 아닐경우 if문안에 for 문이 실행됩니다 이 반복문은 list.get(i) 번째 안에 있는 getSkill().size만큼 반복하여 화면에 출력하게 된다. 즉 list.get(i).getSkill().get(j).getSkillName() 문에서 보는거와같이 만약 i 가 0번째고 getSkill안에 배열이 만약 3개가 있다면 list.get(0).getSkill().get(0).getSkillName() , list.get(0).getSkill().get(1).getSkillName() , list.get(0).getSkill().get(2).getSkillName() 이런식으로 3번 출력되는것이다. 그리고 만약 list.get(i).getSkill() 값이 null 경우 else문이 실행되서 없다라는 글자가 출력되게 된다.
이제 위에서 필요한 Method , Service , Dao , Dto 를 선언해보겠다.
먼저 java 파일을 만드는데 아래의 사진과 같이 만들어준다.
이런식으로 만들어줍니다. 설명을 조금하자면 commons 안에 DBHelper는 드라이버를 로딩하고 DB를 연결하는 역활을 할것이다 그리고 EmployeeDao 와 SkillDao 는 Dao로써의 역활을 하기 때문에 메서드들이 이안에 선언된다.
그리고 Dao 메서드에서 사용할 Dto는 Skill 과 Employee에서 하게 된다. 그후 EmployeeService는 Dao를 관리하는 역활을 한다고 생각하면된다.
이제 하나하나 살펴 보도록 하겠다 먼저 DBHelper 안을 살펴보자면 아래와 같이 코드가 선언되어있다.
설명을 하자면 먼저 private 로 되잇는 String 타입의 드라이버 로딩과 db연결에 필요한 내용을 10~13번까지 선언하고 그안에 들어가는 id 라든지 pw 라든지 url 에 관련된 내용을 채워줍니다 (이거는 나중에 외부에서 가지고 오도록 만들어준다)
14번에서 25번까지의 메서드가 바로 드라이버 로딩과 db 연결에 관한 내용의 메서드 이다 이 메서드는 호출할시 Connection 타입으로 리턴을 하게끔 되어있다 드라이버 로딩과 db 를 연결하고 그 값을 담은 conn 안에 그 데이터를 담아서 호출한곳으로 리턴시켜준다,
그다음 26~50 까지의 문은 close 에 관한 내용이다 만약 conn , pstmt , rs 가 만약 null 아니라면 객체를 종료하는 메서드인것이다 이 메서드는 객체를 종료해야하기 때문에 conn , pstmt , rs 가 매개변수 값으로 입력되어 메서드가 호출된다.
다음으로 살펴볼것은 Dao를 관리하는 Service에 관해서 살펴보도록하겠다.
위와 같이 코드가 적혀있다. 먼저 16~44까지의 설명을 하자면
insert에 관한 내용이다 하지만 insert에 관한 내용이지만 여기에는 트랜잭션이 사용되었다. 그 이유는
table 자체를 스킬만 입력하는 곳을 따로 두었기 때문이다 즉 DB내에 employee 테이블과 skill 테이블이 따로 있는것이다. employee 테이블에는 이름 성별 을 입력하고 skill 안에는 employee Autokey 가 들어오고 스킬name 의 값이 들어오게 된다. 설명을 계속 하자면 먼저 String 타입으로 employeeName와 employeeGender 를 받고 String[] 타입으로 skillName 받아줍니다 그후 22~ 23번 줄에서와 같이 dao객체를 생성자를 통해서 생성후 주소값을 할당해줍니다. 그후 dbhelper안에 있는 dbconn 메서드를 호출하여 conn 의 값을 리턴받습니다.
그다음 try catch 문을총해서 try 문안에서 먼저 26번과 같이 자동적으로 commit이 일어나지 않게끔 false 로 바꿔서 commit이 일어나지 않게 만들어줍니다 그후 27번줄에서 employeedao 주소값안에 employeeinsert 호출시 conn의 값과 employeeName,employeeGender 값을 받아서 메서드를 실행합니다 . 그후 리턴된값을 받아서
28번줄에서와 같이 skilldao 주소값안에 skillinsert 메서드 호출시 리턴받은 값과 conn의 값과 skillName 의 값을 받아서 메서드를 실행하고 이 메서드 까지 모두 성공이 되었을때 commit이 일어나게 만들어줍니다 만약 둘중하나로도 성공하지 못햇을경우에는 catch 문으로 가서 catch 문에 있는 conn.rollback 을 통해서 처리가 일어나기 전으로 돌려보냅니다. 그리고 try 또는 catch 문 둘중 하나라도 실행시 finally가 실행되어 conn의 값을 close 합니다.
16~44까지에 필요한 메서드를 보자면 먼저 employeedao 안에 있는 employeeinsert메서드를 보자면
위 사진과 같이 생겨있다 각각 매개변수 값으로 conn 과 employeeName,employeeGender 의 값을 받아서 메서드를 실행한다. 그후 throws 는 여기에서 나오는 모든 예외를 메서드가 호출된곳으로 던져버린다는 뜻이다.
그다음 일반적으로 쿼리 실행문을 만들고 16번줄에서 쿼리 실행을 위한 준비를 해줍니다 해주는데 이때.
DB 안에 skill table안에는 employee 테이블안에 auto 키가 입력되게끔 되어 있다 그렇기 때문에 입력하고 그값을 다시 skill 테이블 안에도 입력해줘야 한다는 뜻이다. 그렇기 때문에 원래는 insert 후 select 를 하여 다시 insert 하는 과정이 트랜잭션을 통해 한꺼번에 이루어 져야 하지만 16번 문 뒤에잇는Statement.RETURN_GENERATED_KEYS 라는 api를 통해서 insert를 하자마자 return 받는 값으로 Auto 키를 받아오는것이다 그후 17,18번 문을 통해서 쿼리문실행을 위한 준비를 하고 19번에서 쿼리를 실행합니다 그러면 insert가 되고 insert 된값을 20~21번문을 통해서 api에서 리턴받은 값을 받아와서
rs1 안에 담아줍니다 그후 객체를 담고 rs1을 리턴해줍니다. 리턴해준값은 int 형이기 떄문에 리턴을 받고 받은 그값은 다시
skillinsert 의 매개변수 값으로 입력되어 메서드가 실행되는것이다 api를 이용해 select가 들어가야 하는부분을 생략한것이다. 그렇다면 이제 skillinsert 메서드를 살펴보면
이런식으로 되어 있다 설명을 하자면 리턴받은 값을 받아오고
쿼리실행을 위한 준비를 한다음에 set 값으로 rs 의 값과 String[] 타입의 skillName을 set 해주게 되는데 이때
화면에서 입력받은 skillName 의 값이 여러개가 될수도 있기 때문에 for 문을 통해 skillName 의 length 만큼 반복하여 입력해줍니다. 그후 객체를 닫아주게 되면 여기서는 서로다른 table 에 F 키로 연결됩값을 입력하는 트랜잭션을 이용한 insert가 되는것이다.
그다음으로는 다시 EmployeeService 안에 45~70까지 선언되어있는 메서드에 대해서 설명하겠다.
먼저 리턴타입으로 ArrayList<Employee> 으로 메서드 호출한 곳으로 리턴해주게 됩니다.
그다음
ArrayList<Employee> 와 ArrayList<Skill> 타입으로 각각의 객체를 선언하고 그안에 생성자를 통해서 생성된 객체의 주소값을 각각 할당합니다. 그리고 employeedao 와 skilldao 타입의 각각의 객체를 선언하고 그안에도 생성자를 통해서 생성된 객체의 주소값을 각각 할당합니다
그리고 드라이버 로딩과 Db를 연결하고 리턴값으로 conn 의 값을 받아와 줍니다
그후 try 문안에 employeedao 주소값안에 있는 selectemployee 메서드를 호출한다 호출시 conn의 값을 매개변수로 받아메서드를 호출한다 그리고 리턴받은 배열의 값을 emplist 안에 할당해줍니다
마찬가지로 skilldao 주소값 안에 있는 skillselect 메서드 호출시 conn 의 값과 리턴받은 배열을 담은 emplist값을 매개변수로 입력하여 메서드가 호출 됩니다. 그다음 57~67번과 같이 적어서 employee 안에 있는 Skill 배열안에 slist에 담은 값을 set 해줍니다. 그후 호출한곳으로 emplist를 리턴해줍니다. 그리고 화면에서 이제 그 뿌려주는 처리를하는것입니다.
selectemployee 에 필요한 메서드를 보자면
위 메서드는 employee의 값을 가지고와서 employeeDto안에 값을 셋하고 그 list를 리턴해줍니다.
그리고 다음으로는 skillselect 메서드에서는
위 사진과 같이 적혀있다. 이 메서드에서는 inner join을 통해서 employee 테이블안에 no의 값과 skill 안에 no 의 값이 값은것만 select해주고 그 결과 값을 while 문을 통해서 Skill객체 안에 데이터들을 set 한 후에 그 list 들을 호출한곳으로 리턴해주는 역활을 합니다.
'학원에서 배운것들 > TEA - P' 카테고리의 다른 글
2017-05-31-P (0) | 2017.05.31 |
---|---|
2017-05-26-P (0) | 2017.05.26 |
2017-05-24-P (0) | 2017.05.24 |
2017-05-22-P (0) | 2017.05.22 |
2017-05-19-P (0) | 2017.05.19 |