Spring Framework
Spirng Framework는 경량 컨테이너로 자바 객체를 담고 직접 관리 Spirng이 IOC(Inversion Of Control) : 제어의 역전기반의 Framework임을 의미합니다.
Spring 의 주요 특징
POJO(Plain Old Java Object)
POJO란, 객체 지향적인 원리에 충실하면서 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트
코드를 개발할 때 개발자가 특정한 라이브러리나 컨테이너의 기술에 종속적이지 않다는 것을 의미.
의존성 주입(DI) : Dependency Injection
의존성(Dependency)이라는 것은 하나의 객체가 다른 객체없이 제대로 된 역할을 수행할 수 없다는 것을 의미.
주입(Injection) : 말 그대로 외부에서 ‘밀어 넣는 것’을 의미
의존성 주입 : 어떤 객체가 필요한 객체를 외부에서 밀어넣는다는 의미
이를 코드에 대입해 생각해보면 주입을 받는 입장에서는 어떤 객체인지 신경 쓸 필요가 없다.
어떤 객체에 의존하든 자신의 역할은 변하지 않는다.
스프링에서는 ApplicationContext는 존재가 필요한 객체들을 생성하고, 필요한 객체들을 주입하는 역할을 해 주는 구조이다.
IOC ( Inversion of Control )
제어의 역전
사용자가 컨트롤 하지 않고 위임한 특별한 객체에 모든 것을 맡기는 것.
IOC란 기존 사용자가 모든 작업을 제어하던 것을 특별한 객체에 모든 것을 위임하여 객체의 생성부터 생명주기 등 모든 객체에 대한 제어권이 넘어 간 것을 IOC, 제어의 역전이라고 한다.
Annotation
자바에서 Annotation은 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는 기술이다.
즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있다.
어노테이션의 용도
board 만들면서 연습
스프링, DB는 다 설정한상태.
JSP에서 했던거처럼 컨트롤러부터 매퍼까지 만드는데 스프링은 객체를 자동으로 생성해주기때문에 어노테이션을 이용하기만 하면됨 미리 설정해둔 lombok에서 자동으로 만들어줌.
servletcontext에서 자동으로 views에 .jsp를 붙혀주기에 내가만든 이동할 폴더 / 파일명만 붙혀주면됨
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
나는 board 폴더에 register,list 등을 만들예정
register.jsp
<form action="/board/insert" method="post">
title : <input type="text" name="title" placeholder="title..."><br>
writer : <input type="text" name="writer" placeholder="writer..."> <br>
content : <br>
<textarea rows="10" cols="50" name="content" placeholder="content..."></textarea> <br>
<button type="submit">register</button>
</form>
list.jsp
<table>
<tr>
<th>no.1</th>
<th>title</th>
<th>writer</th>
<th>regDate</th>
<th>modDate</th>
</tr>
<c:forEach items="${list }" var="bvo" >
<tr>
<td>${bvo.bno }</td>
<td><a>${bvo.title }</a></td>
<td>${bvo.writer }</td>
<td>${bvo.regDate }</td>
<td>${bvo.modDate }</td>
</tr>
</c:forEach>
</table>
<a href="/"><button type="button">index</button></a>
컨트롤러에서
@RequestMapping("/board/*") 를 해서 리퀘스트 매핑명과 내가 리턴받을 이동할 폴더명이 같다면 리턴받을 필요없이 /board안에서 이동하는게 같기때문에 String 리턴을 받을필요없이 메서드를 void로 만들어도됨
@GetMapping("/register")
public String register() {
// return은 이동하는 jsp 위치 == destPage
return "/board/register";
}
// 같은의미
// @GetMapping("/register")
// public void register() {}
@PostMapping("/insert")
public String insert(BoardVO bvo) {
log.info(">>>> boardVO > {} ", bvo);
int isOk = bsv.register(bvo);
log.info(">>> register > {} " , (isOk > 0 ? "성공" : "실패"));
return "redirect:/";
}
DAO는 Impl 필요없이 mapper에 메서드명을 id로 써서 바로구현
<mapper namespace="com.ezen.spring.dao.BoardDAO">
<!-- id = BoardDAO 메서드명으로 설정 -->
<insert id="register" parameterType="com.ezen.spring.domain.BoardVO">
insert into board(title,writer,content)
values(#{title},#{writer},#{content})
</insert>
</mapper>
list는 request.setAttribute 역할을 하는 객체 Model을 써서 addAttribute로 set하면됨.
@GetMapping("/list")
public String list(Model m) {
// request.setAttribute 역할을 하는 객체 => Model 객체
List<BoardVO> list = bsv.getList();
m.addAttribute("list",list);
return "/board/list";
}
<select id="getList" resultType="com.ezen.spring.domain.BoardVO">
select * from board order by bno desc
</select>
이러면 jsp에서는 parse하고 해줘야하는게 많았지만 spring에서는 다 알아서 해주기때문에 간단하게 추가 / 목록보기 기능이 구현됨 .
list에 title을 누르면 detail 페이지로 들어갈 수 있도록 만들어보기.
일단 list에 a 태그로 title을 누르면 detail로 갈 수 있도록 설정.
<td><a href="/board/detail?bno=${bvo.bno } ">${bvo.title }</a></td>
이렇게 바꿔주고
detail.jsp
<table>
<tr>
<th>no.</th>
<td>${bvo.bno }</td>
</tr>
<tr>
<th>title</th>
<td>${bvo.title }</td>
</tr>
<tr>
<th>writer</th>
<td>${bvo.writer }</td>
</tr>
<tr>
<th>regDate</th>
<td>${bvo.regDate }</td>
</tr>
<tr>
<th>modDate</th>
<td>${bvo.modDate }</td>
</tr>
<tr>
<th>content</th>
<%-- <td>${bvo.content }</td> --%>
<td><textarea rows="10" cols="50">${bvo.content }</textarea> </td>
</tr>
</table>
<a href="/board/list"><button type="button">list</button></a>
모델 m 하고 int bno를 받아서 BoardVO객체의 bvo에 bno를받아 bvo 객체를 하나 받아올 수 있도록하고 모델객체로 addAttribute 하면됨.
@GetMapping("/detail")
public String detail(Model m, @RequestParam("bno") int bno) {
log.info(">>> param bno > {} " , bno);
BoardVO bvo = bsv.getDetail(bno);
m.addAttribute("bvo", bvo);
return "/board/detail";
}
<select id="getDetail" resultType="com.ezen.spring.domain.BoardVO">
select * from board where bno = #{bno}
</select>
이러면 상세페이지도 끝.
상세페이지에 수정, 삭제버튼을 만들기위해 버튼추가하고 herf에 링크추가
<a href="/board/modify?bno=${bvo.bno }"><button type="button">modify</button></a>
<a href="/board/delete?bno=${bvo.bno }"><button type="button">delete</button></a>
modify.jsp를 만들어서 form태그안해서 전송할 데이터를 만들고 post 방식으로 내보냄.
<form action="/board/update" method="post">
<input type="hidden" name="bno" value="${bvo.bno }">
<table>
<tr>
<th>no.</th>
<td>${bvo.bno }</td>
</tr>
<tr>
<th>title</th>
<td><input type="text" name="title" value="${bvo.title }">
</tr>
<tr>
<th>writer</th>
<td>${bvo.writer }</td>
</tr>
<tr>
<th>regDate</th>
<td>${bvo.regDate }</td>
</tr>
<tr>
<th>modDate</th>
<td>${bvo.modDate }</td>
</tr>
<tr>
<th>content</th>
<%-- <td>${bvo.content }</td> --%>
<td><textarea rows="10" cols="50" name="content">${bvo.content }</textarea> </td>
</tr>
</table>
<button type="submit">update</button>
</form>
modify는 detail페이지를 가져와서 수정하는거기떄문에 detail하고 같은 방식으로 getMapping으로 정보를 가져와서
modify.jsp에서 Post된 정보를 받아와 bvo 객체를 update하는 메서드를 만들어서 수정을 구현.
// 두개의 경로를 하나의 메서드처리
@GetMapping({"/detail","/modify"})
public void detail(Model m, @RequestParam("bno") int bno) {
log.info(">>> param bno > {} " , bno);
BoardVO bvo = bsv.getDetail(bno);
m.addAttribute("bvo", bvo);
}
@PostMapping("/update")
public String update(BoardVO bvo) {
log.info(">>> bvo >>>> {}" , bvo);
int isOk = bsv.update(bvo);
log.info(">>> update > {} " , (isOk > 0 ? "성공" : "실패"));
return "redirect:/board/detail?bno="+bvo.getBno();
}
삭제는 그냥 번호만 가져와서 delete하면 끝. list로 돌아가야하기때문에 리턴에 리다이렉트를 넣어서 list로 돌아가게만듬.
@GetMapping("/delete")
public String delete(@RequestParam("bno") int bno) {
int isOk = bsv.delete(bno);
log.info(">>> delete > {} " , (isOk > 0 ? "성공" : "실패"));
return "redirect:/board/list";
}
'Spring 수업 정리' 카테고리의 다른 글
Spring 8일 (0) | 2024.11.06 |
---|---|
Spring 7일 (0) | 2024.11.05 |
Spring 6일 (3) | 2024.11.04 |
Spring 5일 (1) | 2024.11.01 |
Spring 3일차. (0) | 2024.10.30 |