팀 프로젝트를 시작했다
좋은 팀을 만났고 뭘 만들지도 좋은 의견들이 많이 나와서 빠르게 결정했다
주제는 melon 같은 노래 음원 사이트 제작이였다
처음 맡은 일은 DB에 저장되어있는 노래의 리스트를 출력해주는 일이였다.
table 제작이 참 어려웠던 것 같다. 미리 처음에 구상했던 table에서 여차저차 만들다보니
생각보다 많이 바뀌어버렸다
CREATE TABLE Music_tbl(
Music_id varchar2(20) PRIMARY KEY ,
Music_name varchar2(50) NOT NULL ,
Music_time varchar2(100) NOT NULL,
Music_count NUMBER(10) NOT NULL ,
Artist_name varchar2(100) NOT NULL ,
Music_source varchar2(100) NOT NULL ,
Genre_id varchar2(20) NOT NULL ,
CONSTRAINT Genre_id_fk FOREIGN KEY(Genre_id) REFERENCES Genre_tbl(Genre_id)
);
바꾸고 바꾼 끝에 Music_tbl을 만들었고 이걸 통해 리스트에 보여주는 작업을 진행했다.
Mybatis를 이용하여 작업을 진행햇다.
먼저 가져와야 할 정보가 매우 많으므로 객체를 통해 접근하기 위해 MusicDTO를 생성했다.
public class MusicDTO {
private String music_id;
private String music_name;
private String music_time;
private int music_count;
private String artist_name;
private String music_source;
private int genre_id;
}
위에 생성한 MusicDTO의 객채에 값을 담아오는 쿼리문을 작성했다.
<mapper namespace="SpaceMusic">
<select id="getMusicList" resultType="MusicDTO">
select * from music_tbl
</select>
</mapper>
쿼리문을 작성했으니 이것을 사용할 DAO 파일을 살펴보자
public class MusicDAO {
SqlSessionFactory factory = SqlMapConfig.getFactory();
SqlSession sqlsession;
public MusicDAO() {
sqlsession = factory.openSession(true);
}
public List<MusicDTO> getMusicList() {
List<MusicDTO> MusicList = sqlsession.selectList("SpaceMusic.getMusicList");
return MusicList;
}
}
노래가 한곡이 아니기때문에 List를 통해 MusicDTO 객체를 받아왔다
위에 작성한 쿼리문을 맵핑하기 위해 SpaceMusic 안의 getMusicList를 사용했다
받아온 List를 return 해줬으니 이것을 사용할 곳으로 가보자
먼저 Action이라는 interface를 생성해주자.
Controller를 통해 Action java 파일의 접근을 해줄 것이고 지금은 기능이 하나지만
여러개의 기능이 늘어날 경우 ACtion java에 모든 곳에 같은 기능을 계속 구현하는 것보다는
하나의 interface를 생성하여 상속받아 사용하면 좋기 때문에 Action interface를 구현했다.
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public interface Action {
public ActionForward execute(HttpServletRequest req, HttpServletResponse resp);
}
ActionForwad 파일도 생성해주자
public class ActionForward {
private boolean isRedirect; // 방식
private String path; // 경로
// 기본 생성자
public ActionForward() {
}
// 초기화 생성자
public ActionForward(boolean isRedirect, String path) {
super();
this.isRedirect = isRedirect;
this.path = path;
}
// getter(), setter()
public boolean isRedirect() {
return isRedirect;
}
public void setRedirect(boolean isRedirect) {
this.isRedirect = isRedirect;
}
public String getPath() {
return path;
}
public void setPath(String path) {
this.path = path;
}
}
이제 실질적으로 사용할 Action java파일을 확인해보자
본인은 List를 받아오는 작업이기 때문에 파일이름을 getListAction으로 해줬고, 이름은 본인
마음대로 지으면 되겠다
public class getListAction implements Action {
@Override
public ActionForward execute(HttpServletRequest req, HttpServletResponse resp) {
ActionForward forward = new ActionForward();
MusicDAO mdao = new MusicDAO();
req.setAttribute("MusicList", mdao.getMusicList());
forward.setRedirect(false);
forward.setPath("/top100.jsp");
return forward;
}
}
위에 미리 선언해준 Action interface를 상속받아 execute 메소드를 선언해주었다
MusicDAO 객채도 선언하여 getMusicList 메소드를 불러와 request 객체에 할당해주었고
Path를 "/top100.jsp"로 지정해주었다
이제 DB 쿼리문을 통해 가져온 값을 원하고자 하는 페이지에 까지 이동시키는게 완료됬다
그럼 top100.jsp 페이지에서 데이터를 보여줘보도록 하자
받아온 값을 좀더 쉽게 사용하기위해 JSTL을 사용했다
사용하기 위해서는 아래 문구와 liberary 파일만 추가해주면 된다.
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<c:set var="MusicList" value="${requestScope.MusicList }" />
위의 getListAction에서 보내준 MusicList값을 받아오는 작업이다
<c:forEach var="music" items="${MusicList }">
<div class="item" id="item1">
<ul>
<li>${music.music_id }</li>
<li id="asd"><h4>${music.music_name }</h4><span>${music.artist_name }</span></li>
<li><h4>재생시간</h4><span>${music.music_time }</span></li>
<li>
<h4>장르</h4><span>${music.genre_id} </span>
</li>
<li>{music.music_source }/li>
forEach문을 통해 받아온 List의 크기만큼 반복문을 돌려주고 ul li문을 통해
화면에 리스트 형식으로 보여주었다.
저 화면을 보여주기전 main이다
<button onclick="location.href='/getList.sm">리스트 보기</button>
보다 보면 이상한점을 느꼇을 것이다. 생각하신게 맞다 현 경로를 보면 /getList.sm으로 설정을 해주었는데 우리는 저 파일을 만든적이 없다. 그래서 저 경로로 이동을 시켜줄 controller을 작성할 것이다
@WebServlet("*.sm")
public class SpaceMusicFrontController extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doProcess(req, resp);
} // doGet()
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doProcess(req, resp);
} // doPost()
protected void doProcess(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String requestURI = req.getRequestURI();
ActionForward forward = null;
switch (requestURI) {
// top100 리스트 가져오는 경우
case "/getList.sm":
forward = new getListAction().execute(req, resp);
break;
}
// 페이지 일괄 처리
if (forward != null) {
if (forward.isRedirect()) { // redirect 방식
resp.sendRedirect(forward.getPath());
} else { // forward 방식
RequestDispatcher disp = req.getRequestDispatcher(forward.getPath());
disp.forward(req, resp);
}
} // doProcess() if문
위에 코드를 보면 @WebServlet("*.sm")을 통해 .sm으로 끝나는 모든 경로를 해당 서블릿을 통과하게 만들었다. 또한 doProcess 메소드를 생성하여 get 방식이든 post 방식이든 처리할 수 있도록 하였다. URI를 통해 경로를 확인하고 case문을 통해 getListAction을 실행한다. 지금은 Action 및 controller에 하나 밖에 없어 왜 case문을 사용하는지 의문을 가질 수 있지만 추가적으로 페이지가 늘어날 경우 case문을 추가하기 매우 용이하기 때문에 사용한다.
forward 객체에 getListAction에서 받아온 값들을 할당하고 아래에 if문을 통해 보여주고 하자는 top100.jsp 페이지를 보여준다.
진행하면서 느낀점은 혼자하는 것 보다 팀원과 함께하니 더 재밌었고, 다음 기능으로 찾아오도록 하겠다