본문 바로가기

개발 회고

[솔데스크] 풀스택 과정 12주-5 총54회차 ‘회고’ | 스프링(0223)

[서론]

○● 0223새로웠던 것
1.

		String one = service.getOne();
		String two = service.getTwo();
		Integer sum = Integer.parseInt(one) + Integer.parseInt(two);

이 코드에서 Integer는 자바의 래퍼 클래스인 Integer를 나타냅니다. 이 클래스는 정수 값을 객체로 래핑하며, 기본적으로 int와 동일한 역할을 합니다.

여기서 Integer는 숫자 배열이 아니라 단일 정수 값을 나타냅니다. Integer 클래스는 단일의 정수를 갖습니다. 만약 숫자 배열을 나타내려면 int[]나 Integer[]와 같은 배열 형태를 사용해야 합니다.

따라서 Integer는 단일 정수 값을 나타내는 클래스입니다. 여기서는 one과 two라는 문자열로부터 얻은 값을 정수로 변환하여 더하고 있습니다.


2. @Setter(onMethod_ = @Autowired)

@Setter(onMethod_ = @Autowired)는 Java의 Lombok 라이브러리를 사용하여 생성자나 직접적인 Setter 메서드를 자동으로 생성하고, 해당 메서드에 @Autowired 어노테이션을 추가하는 것을 나타냅니다.

여기서 @Autowired는 Spring 프레임워크에서 사용되는 어노테이션으로, 의존성 주입(Dependency Injection)을 수행할 때 해당 필드를 자동으로 연결하도록 Spring 컨테이너에게 알려줍니다.

따라서 @Setter(onMethod_ = @Autowired)를 사용하면 Lombok이 Setter 메서드를 생성할 때 자동으로 @Autowired 어노테이션을 추가하여 Spring이 필드를 주입할 수 있도록 도와줍니다.

 

3. css잘 안먹힐때는 file 링크를 /spring을 지우고 /guest로 시작하게 하기

path도 위 이미지처럼 수정하기

 

 

[본론]
○● 0223  내용 정리
 
● 스프링

 

○○○●●● 방명록

 

1. 각 화면 별 기본 작업

[1].방명록-list
*.PJ Mi ( 1 + 2 하던거에 추가해서 )

0.디비
테이블 생성하기
생성 대상 계정 root      /    root 테이블명 tbl_guest 열1 bno number(6) 열2 btext varchar2(1000)
create table tbl_guest(
bno int auto_increment primary key,
btext text
);
시퀀스 생성하기 시퀀스명 seq_guest CREATE SEQUENCE seq_guest;

테스트 데이터 넣기
insert into tbl_guest (btext) values('개');
insert into tbl_guest (btext) values('고양이');

*주의* 기존 domain 패키지와 VO 를 .dto 와 Dto 로 변경함 ( 먼저 하신분들은 참고.. )

1.영속
패키지 com.peisia.dto추가 com.peisia.domain 에 추가

VO 클래스 추가 GuestVO cohttp://m.peisia.domain 에 추가하기

Dto 클래스 추가 GuestDto cohttp://m.peisia.dto 에 추가하기

매퍼 인터페이스 추가 GuestMapper 기존 cohttp://m.peisia.mapper 에 추가하기

매퍼 xml 추가 GuestMapper.xml src/main/resources/com/peisia/mapper/ 밑에 추가하기

2.biz
서비스 인터페이스 추가하기 GuestService  com.peisia.service 에 추가하기

서비스 인터페이스 구현 클래스 GuestServiceImpl com.peisia.service 에 추가하기

3.화면
컨트롤러 추가 GuestController com.peisia.controller 에 추가하기

상단 url 홈페이지/guest/ 코드 추가>> @RequestMapping("/guest/*")
하단 url ( 함수별 ) 홈페이지/guest/ /getList 코드 추가>> @GetMapping("/getList")

jsp 파일 추가 PJ/src/webapp/WEB-INF/views/상단/하단.jsp 코딩
PJ/src/webapp/WEB-INF/views/guest/ getList.jsp 추가하기

참고: JSTL 적용 버전 getList.jsp

*.실행 확인
브라우저에 url 입력: http://localhost:8080/spring/guest/getList

[2].방명록-read

1.영속
매퍼 인터페이스에 추상함수 추가 GuestMapper

매퍼 xml에 태그 추가 GuestMapper.xml

2.biz
서비스 인터페이스에 추상함수 추가 GuestService 

서비스 인터페이스 구현 클래스에 오버라이딩 함수 추가 GuestServiceImpl

3.표현
컨트롤러에 매핑 함수 추가 GuestController

jsp 파일 추가 PJ/src/webapp/WEB-INF/views/guest/ read.jsp 추가하기

참고: el 적용 버전 read.jsp

*.실행 확인
브라우저에 url 입력: http://localhost:8080/spring/guest/read?bno=1

[3].방명록-del

1.영속
매퍼 인터페이스에 추상함수 추가 GuestMapper

매퍼 xml에 태그 추가 GuestMapper.xml

2.biz
서비스 인터페이스에 추상함수 추가 GuestService 

서비스 인터페이스 구현 클래스에 오버라이딩 함수 추가 GuestServiceImpl

3.표현
컨트롤러에 매핑 함수 추가 GuestController

*.실행 확인
브라우저에 url 입력: http://localhost:8080/spring/guest/del?bno=2

[4].방명록-write

1.영속
매퍼 인터페이스에 추상함수 추가 GuestMapper

매퍼 xml에 태그 추가 GuestMapper.xml

2.biz
서비스 인터페이스에 추상함수 추가 GuestService 

서비스 인터페이스 구현 클래스에 오버라이딩 함수 추가 GuestServiceImpl

3.표현
컨트롤러에 매핑 함수 추가 GuestController



jsp 파일 추가 PJ/src/webapp/WEB-INF/views/guest/ write.jsp 추가하기

*. 톰캣-모듈 에서 루트 경로를 / 로 수정 해 놓기

*.한글로 글 작성 시 깨짐 방지 UTF-8 설정
PJ/src/main/webapp/WEB-INF/ web.xml << </web-app> 태그 위에 이 내용 추가하기

*.실행 확인
브라우저에 url 입력: http://localhost:8080/guest/write

본문 작성하고 확인 버튼 누르고

자동으로 리스트 화면으로 돌아오는데 글이 추가되어 있는지 확인하기


500 에러 이 케이스 경우: xml 해당 id 가 함수명과 동일한지 확인해보기 오라클: 매퍼 xml


[5].방명록-modify

1.영속
매퍼 인터페이스에 추상함수 추가 GuestMapper

매퍼 xml에 태그 추가 GuestMapper.xml

2.biz
서비스 인터페이스에 추상함수 추가 GuestService 

서비스 인터페이스 구현 클래스에 오버라이딩 함수 추가 GuestServiceImpl

3.표현
컨트롤러에 매핑 함수 추가 GuestController

jsp 파일 추가 PJ/src/webapp/WEB-INF/views/guest/ modify.jsp 추가하기

*.실행 확인
브라우저에 url 입력: http://localhost:8080/guest/modify?bno=1


1.영속 매퍼 인터페이스
매퍼 xml
2.biz 서비스 인터페이스
서비스 인터페이스 구현 클래스
3.표현 컨트롤러
4.글수정화면 컨트롤러 수정
modify.jsp
*.실행 확인 http://localhost:8080/guest/modify?bno=1

2. 각 화면 연결

홈에 게시판 링크 걸기 home.jsp 에 <a href="/guest/getList">방명록</a>

홈에 UTF-8 처리
home.jsp 상단에 "<%@ page language=""java"" contentType=""text/html; charset=UTF-8""
    pageEncoding=""UTF-8""%>"
추가해서 한글 안깨지게 하기
추가로 헤드 태그에도 <meta charset="UTF-8"> 삽입

리스트에 글쓰기 링크 추가 getList.jsp <a href="/spring/guest/write">새글 쓰기</a>

글 리스트에서 각 글에 링크를 달아 각 글을 읽는 화면으로 이동
getList.jsp <a href="/guest/read?bno=<%=bno%>"> <%=btext %> </a>

EL 적용 버전 <a href="/guest/read?bno=${guest.bno}">${guest.btext}</a>

글읽기에서 read.jsp 삭제 링크 추가 <!-- [ ] 글삭제로 이동. 글번호를 넘겨야함. -->
<a href="/spring/guest/del?bno=<%=bno%>">글 삭제</a>

EL 적용 버전 <a href="/spring/guest/del?bno=${read.bno}">글 삭제</a>

수정 링크 추가 <!-- [ ] 글 수정으로 이동. 글번호를 넘겨야함. -->
<a href="/spring/guest/modify?bno=<%=bno%>">글 수정</a>

EL 적용 버전 <a href="/spring/guest/modify?bno=${read.bno}">글 수정</a>

리스트로 가기 추가 <!-- [ ] 글 리스트로 이동. -->
<a href="/spring/guest/getList">글 리스트</a>


3. 화면 꾸미기

 

리스트를 테이블 ui 로 getList.jsp

JSTL,EL 적용버전 getList.jsp

리스트에 css 적용하기

1.css 파일 추가 PJ/src/main/webapp/resources/ common.css 추가하기

2.getList.jsp 의 헤더 태그 내에 추가 <link rel="stylesheet" href="/resources/common.css" >

* 중요 *
PJ/src/main/webapp/resources/ 이 폴더에 이미지파일, css 파일 등을 주로 여기에 넣음

그리고 여기에 넣은 파일에 대한 주소 링크는

컨텍스트패스/resources/common.css 식으로 연결하면 됨.

 

com.peisia.dto>GuestDto.java

package com.peisia.dto;

import lombok.Data;

@Data
public class GuestDto {
	private Long bno;
	private String btext;
}

com.peisia.mapper>GuestMapper.java

package com.peisia.mapper;

import java.util.ArrayList;

import com.peisia.dto.GuestDto;

public interface GuestMapper {
	public ArrayList<GuestDto> getList();
	public GuestDto read(long bno);
	public void del(long bno);
	public void write(GuestDto dto);
	public void modify(GuestDto dto);
}

com.peisia.service>GuestService.java

package com.peisia.service;

import java.util.ArrayList;

import com.peisia.dto.GuestDto;


public interface GuestService {
	public ArrayList<GuestDto> getList();
	public GuestDto read(long bno);
	public void del(long bno);
	public void write(GuestDto dto);
	public void modify(GuestDto dto);
}

com.peisia.service>GuestServiceImpl.java

package com.peisia.service;

import java.util.ArrayList;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.peisia.dto.GuestDto;
import com.peisia.mapper.GuestMapper;

import lombok.Setter;
import lombok.extern.log4j.Log4j;

@Log4j
@Service
//@AllArgsConstructor
public class GuestServiceImpl implements GuestService{

	@Setter(onMethod_ = @Autowired)
	private GuestMapper mapper;	
	
	@Override
	public ArrayList<GuestDto> getList() {
		log.info("비지니스 계층===========");
		return mapper.getList();
	}
	
	@Override
	public GuestDto read(long bno) {
		return mapper.read(bno);
	}
	
	@Override
	public void del(long bno) {
		mapper.del(bno);
	}
	
	@Override
	public void write(GuestDto dto) {
		mapper.write(dto);
	}		
	
	@Override
	public void modify(GuestDto dto) {
		mapper.modify(dto);
	}	
}

com.peisia.spring>GuestController.java

package com.peisia.spring;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.peisia.dto.GuestDto;
import com.peisia.service.GuestService;

import lombok.AllArgsConstructor;
import lombok.extern.log4j.Log4j;

@Log4j
@RequestMapping("/guest/*") // 프로젝트 루트 경로 이하 /guest 상위폴더로 진입 시 여기로 진입하게 됨.
@AllArgsConstructor // 필드 값을 매개변수로 하는 생성자를 스프링이 알아서 만들어 줌. 그리고 그런 형태의 생성자를 추가하면 스프링이 알아서 객체관리
					// 해줌(@Auto.. 처럼)
@Controller
public class GuestController {

//	위에 @AllArgsConstructor 이걸 쓰면
//	롬복라이브러리가 아래 코드를 자동으로 삽입해줌

	//
//	public GuestController(GuestService service){
//		this.service = service;
//	}

	private GuestService service;

	@GetMapping("/getList") // 프로젝트 루트 경로 이하 /guest/getList url 진입 시 여기로 진입하게 됨.
	public void getList(Model model1) { // 매개변수에 Model m 식으로 작성하게 되면, 스프링이 알아서 모델 객체를 만들어서 넘겨줌.
		model1.addAttribute("list", service.getList());
	} // 위 /getList 와 동일한 jsp파일을 염. 상위 경로 포함(/guest). 즉 PJ루트/guest/getList.jsp 파일을 염.
	// 그리고 이 파일은
	// PJ\src\main\webapp\WEB-INF\views\guest\getList.jsp
	// 에 만들어 놓으면 됨.

	// 이런식으로 url 호출될 것을 가정하고..
	// >>> 홈페이지/spring/guest/read?bno=3
//	@GetMapping("/read")
//	public void read(@RequestParam("bno") Long bno, Model model) {
//		log.info("컨트롤러 ==== 글번호 ==============="+bno);
//		model.addAttribute("read",service.read(bno));
//	}

	@GetMapping({ "/read", "/modify" })
	public void read(@RequestParam("bno") Long bno, Model model) {
		log.info("컨트롤러 ==== 글번호 ===============" + bno);
		model.addAttribute("read", service.read(bno));
	}

	// 이런식으로 url 호출될 것을 가정하고..
	// >>> 홈페이지/spring/guest/del?bno=2
	@GetMapping("/del")
	public String del(@RequestParam("bno") Long bno) {
		log.info("컨트롤러 ==== 글번호 ===============" + bno);
		service.del(bno);
		return "redirect:/guest/getList"; // sendRedirect 로 이동하게 됨.
	}

	// >>> 홈페이지/spring/guest/write (Post 방식으로 오면 여기로 옴)
	@PostMapping("/write")
	// 폼 태그의 텍스트에어리어 태그에 btext 변수로 데이터가 넘어왔는데
	// 매개변수에 (GuestVO gvo) 이런 클래스를 선언해놓게 되면
	// 해당 객체의 멤버변수에 스프링이 알아서 채워줌.
	public String write(GuestDto dto) {
		service.write(dto);
		return "redirect:/guest/getList"; // sendRedirect 로 이동하게 됨. // 책 p.245 참고
	}

	// >>> 홈페이지/spring/guest/write (get 방식으로 오면 여기로 옴. 일반링크이동=get방식임)
	@GetMapping("/write") // 책 p.239 /write 중복이지만 이건 글쓰기 화면을 위한 url 매핑
	public void write() {

	}

	@PostMapping("/modify")
	public String modify(GuestDto dto) {
		service.modify(dto);
		return "redirect:/guest/getList";
	}

}

 

src>main>resources>com/peisia/mapper>GuestMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
	PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.peisia.mapper.GuestMapper">
	<!-- resultType 에 복수형(ArrayList 등)을 적는게 아님. 
	그냥 dto 단수의 경로를 적어야됨. -->
	<select id="getList" resultType="com.peisia.dto.GuestDto">
		SELECT * from tbl_guest
	</select>
	
	<select id="read" resultType="com.peisia.dto.GuestDto">
		<!-- #{bno} << 마이바티스 문법임. -->
		<!--
			매퍼 인터페이스의 read 함수의 매개변수로 넘어오는 값을 받아 처리하는 sql문임.
			
			매개변수로 넘어온 값을 sql 에 삽입하려면
			
			해당 매개변수명을 #{ } 로 묶으면 안에 값이 뿅 나옴.
		-->
		select * from tbl_guest where bno = #{bno}
	</select>	
	
	<delete id="del">
		delete from tbl_guest where bno = #{bno}
	</delete>
	
	
	<!-- #{btext} << 마이바티스 문법임. -->
	<!--
		매퍼 인터페이스의 write 함수의 매개변수로 넘어오는 값을 받아 처리하는 sql문임.
		
		주의할 부분이 GuestDto 객체가 매개변수로 넘어오는데
		
		마이바티스 변수 #{btext} 를 써도 해당 값을 뽑아옴.
		
		해당 값은 btext 멤버변수 값을 말함.
		(내부적으론 getBtext 함수를 호출해서 얻어옴)		
	-->	
	<insert id="write">
		insert into tbl_guest (btext) values (#{btext})
	</insert>
	
	
	<update id="modify">
		update tbl_guest
		set btext = #{btext}
		where bno = #{bno}
	</update>	
					
</mapper>

 

 

[결론]
 
* 스프링 기초 강의 수강

 

*작업파일


 0222
1) 스프링 기초