본문 바로가기

Spring 수업 정리

Spring 1일차.

Spring Framework

자바 플랫폼을 위한 오픈소스 애플리케이션 프레임워크로서 엔터프라이즈급 애플리케이션을 개발하기 위한 모든 기능을 종합적으로 제공하는 경량화된 솔루션

Spirng Framework는 경량 컨테이너로 자바 객체를 담고 직접 관리 SpirngIOC(Inversion Of Control) : 제어의 역전기반Framework임을 의미합니다.

 

Spring 의 주요 특징

POJO 기반의 구성
의존성 주입(DI)를 통한 객체 간의 관계구성
AOP(Aspect-Oriented-Programming)지원
편리한 MVC 구조
WAS의 종속적이지 않은 개발 환경

 

POJO(Plain Old Java Object)

POJO객체 지향적인 원리에 충실하면서 환경과 기술에 종속되지 않고 필요에 따라 재활용될 수 있는 방식으로 설계된 오브젝트

코드를 개발할 때 개발자가 특정한 라이브러리나 컨테이너의 기술에 종속적이지 않다는 것을 의미.

 

의존성 주입(DI) : Dependency Injection

의존성(Dependency)이라는 것은 하나의 객체가 다른 객체없이 제대로 된 역할을 수행할 수 없다는 것을 의미.

주입(Injection) : 그대로 외부에서 밀어 넣는 것을 의미

의존성 주입 : 어떤 객체가 필요한 객체를 외부에서 밀어넣는다는 의미

 

이를 코드에 대입해 생각해보면 주입을 받는 입장에서는 어떤 객체인지 신경 쓸 필요가 없다.

어떤 객체에 의존하든 자신의 역할은 변하지 않는다.

스프링에서는 ApplicationContext는 존재가 필요한 객체들을 생성하고, 필요한 객체들을 주입하는 역할을 해 주는 구조이다.

 

IOC ( Inversion of Control )

제어의 역전

사용자가 컨트롤 하지 않고 위임한 특별한 객체에 모든 것을 맡기는 것.

IOC란 기존 사용자가 모든 작업을 제어하던 것을 특별한 객체에 모든 것을 위임하여 객체의 생성부터 생명주기 등 모든 객체에 대한 제어권이 넘어 간 것을 IOC, 제어의 역전이라고 한다.

 

Annotation

자바에서 Annotation 코드 사이에 주석처럼 쓰이며 특별한 의미, 기능을 수행하도록 하는  술이다.
즉, 프로그램에게 추가적인 정보를 제공해주는 메타데이터라고 볼 수 있다.

 

어노테이션의 용도

컴파일러에게 코드 작성 문법 에러를 체크하도록 정보를 제공한다.
소프트웨어 개발 툴이 빌드나 배치시 코드를 자동으로 생성할 수 있도록 정보를 제공한다.
실행시(런타임시)특정 기능을 실행하도록 정보를 제공한다.
어노테이션을 사용하는 순서
어노테이션을 정의한다.
클래스에 어노테이션을 배치한다.
코드가 실행되는 중에 Reflection을 이용하여 추가 정보를 획득하여 기능을 실시한다.

 


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