본문 바로가기

Spring

240216 스프링 프로젝트

로그 확인해보기

스프링에서 자동으로 객체를 생성해주는 모습

 

/board 를 입력했을 때 나오는 로그

 

게시글을 보기 위해 DB 와 연결

SqlSession 을 생성하는 모습

 

입력한 쿼리문을 실행

내가 입력한 SQL 문과 실제 입력된 sql 문을 보여줌

 

요청한 리턴된 개수만큼 ResultSet 이 생성

Select 의 결과로 ResultSet 이 자동으로 반환

 

Autowired 는 객체 생성이 필요한 곳마다 적어줘야 함

@Autowired
private BoardService boardService;

@Autowired
private Util util;

 

어제는... 분명히.. 서비스에서 int 로 변경한다고 했던거같은데,,,

Util 을 int 로 변환을 하고, int 변환이 안되면 

@Component
public class Util {
  public int str2Int(String no) {
    try {
      return Integer.valueOf(no);
    } catch (Exception e){
      return -1;
    }
  }
}

 

Controller 에서 Util @Autowired 하고

@GetMapping("/detail")
public String detail(Model model, String no) {
  if (util.str2Int(no) != -1) {
    System.out.println("정상 입력");
    model.addAttribute("detail", boardService.detail(util.str2Int(no)));
    return "detail";
  } else {
    System.out.println("틀린 입력");
    return "error/error";
  }
}

 

하지만 이렇게 되면 에러 페이지의 url 주소가 detail?no= 로 유지

주소도 /error 로 변경하고 싶다면

@GetMapping("/detail")
public String detail(Model model, String no) {
  if (util.str2Int(no) != -1) {
    System.out.println("정상 입력");
    model.addAttribute("detail", boardService.detail(util.str2Int(no)));
    return "detail";
  } else {
    System.out.println("틀린 입력");
    // return "error/error";
    return "redirect:/error"; // controller 에 있는 error 매핑을 실행 @Getmapping("/error")
  }
}

 

error 를 잡기 위해 에러만 잡는 Controller 생성하기

@Controller
public class ErrorController {

  @GetMapping("/error")
  public String error() {
    return "error/error"; // WEB-INF/views/error/error.jsp 로 이동
  }
}

 

일단 단순 에러 메세지만 출력

Controller 에서 파라미터 값을 받을 수 있는 수 몇가지

public String detail(Model model, @Param("no") int no)
  파라미터의 no= 값을 받아줌, 자동으로 형에 맞게 변환
  만약 입력 값이 int 가 아닐 경우 400 에러 발생

public String detail(Model model, HttpServletRequest request) {
  request.getParameter("no") 로 no= 값을 받아줌
  
public String detail(Model model, String no)
  스프링에서 자동으로 파라미터와 일치하는 값을 받아줌

 

값을 넘길 때에는 꼭 무조건 값 집어넣기

public BoardDTO detail(int no) {
  return sqlSession.selectOne("board.detail", no);
}

 

board-mapper 에 쿼리문 작성해보기

서브쿼리를 이용하여 작성해보고, join 을 이용해서도 만들어보기

<select id="detail" resultType="boardDTO" parameterType="int">
  select board_no, board_title, board_content, 
  (select mname from member where mno=board.mno) as mname,
  board_date, board_count, board_ip, board_del  
  from board where board_no=#{no} and board_del='1'
</select>
    
<select id="detail2" resultType="boardDTO" parameterType="int">
  select board_no, board_title, board_content
  , mname, board_date, board_count 
  from board join member on board.mno = member.mno 
  where board_no=#{no} and board_del='1'
</select>

 

스프링 책에서 나온대로 log 양 조절해보기

src/text/resources > log4j.xml 에 logger 추가

<logger name="jdbc.audit">
  <level value="warn"/>
</logger>

<logger name="jdbc.resultset">
  <level value="warn"/>
</logger>

<logger name="jdbc.connection">
  <level value="warn"/>
</logger>

 

자세한 로그 레벨에 관한 내용은 여기로

 

Log4j – Custom Log Levels

Copyright © 1999-2023 The Apache Software Foundation. All Rights Reserved. Apache Logging, Apache Log4j, Log4j, Apache, the Apache feather logo, and the Apache Logging project logo are trademarks of The Apache Software Foundation.

logging.apache.org

 

detail.jsp 에 게시글 목록으로 다시 돌아가는 버튼 만들기

<button onclick="location.href='./board'">목록</button>
/board 로 매핑하기

<button onclick="history.back()">목록</button>
페이지 뒤로가기, 이전 페이지로 이동

<button onclick="history.go(-1)">목록</button>
.go() 괄호 안의 숫자만큼 앞으로, 뒤로 이동
양수일 경우 앞으로 가기, 음수인 경우 뒤로가기
-1 이면 back() 과 동일, -2 면 back() 이 2번 진행

 

board.jsp 에 글쓰기 버튼 만들고, 글쓰기 버튼 클릭 시 modal 로 만들기

<!-- 글쓰기 모달 만들기 -->
<div class="modal">
  <h1>모달</h1>
</div>

 

board 에 들어가도 class="modal" 은 화면에 보이지 않음

자동 숨김처리 기능이 되어 있음, Bootstrap 기능

<!-- 글쓰기 버튼, 모달로 띄우기 -->
<button class="btn btn-outline-dark" data-bs-toggle="modal" data-bs-target="#write">글쓰기</button>
	
<!-- 글쓰기 모달 만들기 -->
<div class="modal" id="write">
  <h1>모달</h1>
</div>

 

modal 창 만들기 - 수정중

aria-label 은 없어도 동작 가능, 역할은 해당 기능의 간단한 설명 제공

	<!-- 글쓰기 모달 만들기 -->
	<div class="modal" id="write">
		<div class="modal-dialog modal-xl">
			<div class="modal-content">
				<div class="modal-header">
				  <h4 class="modal-title">글쓰기</h4>
				  <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
				</div>
				<div class="modal-body">
				  <div class="mt-2">
				    <form action="./write" method="post">
				      <input type="text" name="title" class="form-control mb-2" placeholder="제목 입력하기">
				      <textarea name="content" class="form-control mb-2 vh-500" placeholder="내용 입력하기"></textarea>
				      <button type="submit" class="btn btn-outline-dark">작성하기</button>
				    </form>
				  </div>
				</div>
			</div>
		</div>
	</div>

 

폼 컨트롤에 대한 설명

 

폼 컨트롤

텍스트 형식의 <input>이나 <textarea>과 같은 폼 컨트롤에 사용자 정의 스타일, 크기 조정, 포커스 상태등의 업그레이드를 실시할 수 있습니다.

getbootstrap.kr

 

 

BoardController 에서 write 받기

@PostMapping("/write")
public String write(BoardDTO dto) {
  int result = boardService.write(dto);
  System.out.println("결과 : " + result);
  return "redirect:/board";
}

 

form 의 method 가 post 라 어노테이션을 PostMapping 으로 받음

매개변수를 BoardDTO 처럼 담을 수 있는 매개변수로 넣을 경우

해당 DTO 안에 name 을 DTO 의 담을 이름과 같게 맞추면 됨

<input type="text" name="board_title" class="form-control mb-2" placeholder="제목 입력하기">
<textarea name="board_content" class="form-control mb-2 vh-500" placeholder="내용 입력하기"></textarea>

 

서비스는 그냥 retrun 만 있어서 패스

 

Repository 에서는

public int write(BoardDTO dto) {
  return sqlSession.insert("board.write", dto);
}

 

mapper 에 insert 문 추가

<insert id="write" parameterType="boardDTO">
  insert into board (board_title, board_content, mno) 
  values (#{board_title}, #{board_content}, 
  (select mno from member where mid=#{mid}));
    <selectKey resultType="Integer" keyProperty="board_no" order="AFTER">
    select last_insert_id()
    </selectKey>
</insert>

 

selectKey 는 Key 값을 잡아줌

select last_insert_id() -> 는 마지막에 입력한 pk 값을 받아줌

 

@PostMapping("/write")
public String write(BoardDTO dto) {
  int result = boardService.write(dto);
  // 여기서 result 는 executeUpdate 의 결과 값과 같음
  System.out.println("result 결과 : " + result);
  System.out.println("dto no 값 : " + dto.getBoard_no());
//    return "redirect:/board"; // List 로 가기
  return "redirect:/detail?no=" + dto.getBoard_no(); // 작성한 글로 가기
}

 

dto.getBoard_no() 가 되는 이유는 mybatis 에서 값을 넣어줌

DB 가기 전 no 값을 보면 0 이지만, 갔다온 후 no 값을 보면 mybatis 가 넣어주었기 때문에 값이 들어있음

 

신기하네,,

 

자바스크립트로 글 쓸때 체크하기

일단 폼에 onsubmit 과 name 추가

<form action="./write" method="post" onsubmit="return writeCheck()" name="modalform">

 

 

글자 수 제한 걸기

function writeCheck() {
  let title = document.querySelector("#title");
  let content = document.querySelector("#content");
  // alert("title : " + title.value + "\ncontent : " + content.value);
  if (title.value.length < 5) {
    alert("제목은 5글자 이상으로 작성해주세요");
    title.focus();
    return false;
  }
  if (content.value.length < 10) {
    alert("내용은 10글자 이상으로 작성해주세요");
    content.focus();
    return false;
  }
}

 

이거 대신에 input, textarea 에 

maxlength, minlength 로 최대, 최소 글자 수를 지정할 수 있음

 

document.querySelector() 의 역할

 

Document.querySelector() - Web API | MDN

Document.querySelector() 는 제공한 선택자 또는 선택자 뭉치와 일치하는 문서 내 첫 번째 Element (en-US)를 반환합니다. 일치하는 요소가 없으면 null을 반환합니다.

developer.mozilla.org

 

'Spring' 카테고리의 다른 글

240220 스프링 프로젝트  (0) 2024.02.20
240219 스프링 프로젝트  (0) 2024.02.19
240215 스프링 프로젝트  (0) 2024.02.15
240214 스프링 프로젝트  (1) 2024.02.14
240213 스프링 프로젝트  (0) 2024.02.13