본문 바로가기

국비과정/Spring

20230719 _[33일차]_01. Spring 게시판 수정 & 삭제 버튼 생성

http://gofile.me/63QAy/vS8wbABZZ

 

Connecting...

어디서나 모든 장치에서 파일을 액세스, 공유 및 공동 작업할 수 있습니다. 전체 데이터 소유권을 가져오며 구독 요금이 없습니다. {0}자세한 정보{1} 원활한 로밍, 손쉬운 관리 및 기본 제공되는

gofile.me

 

심심할때 보기

 


이제 글쓰기 하면 ip주소 뜨게 만들자

 server 에서 톰캣 더블클릭해서 port 넘버 80으로 수정

아래 모듈에서 Edit 눌러서 path /로 수정

url이 줄어듬

 


 

Get방식은 가져와서 보여주기만 하고  

Post방식은 가져오는거니 여기에서 작업

 

ip주소 String으로 가져올거

 

request에서 getHeader() 로 값을 뽑아왔는데

"unknown".equalsIgnoreCase(ip)  => 대소문자 상관없이 

ip.equalsIgnoreCase("unknown"))  요렇게 써도 같은의미

 

계속 if 만 사용해서 조건식 설정 (else 사용하면 위에서 조건해당되면 실행을 멈추니까 )

전부 적어줬다

마지막 request.getRemoteAddr() => 만약 위의 헤더들이 모두 존재하지 않는 경우, 기본적으로 클라이언트의 IP를 가져옴.

 

요렇게 가져온 ip를 일단 글쓰기 본문에 같이 찍어보자

http://localhost/ 로만 내 사이트에 접속 가능

글을 써보면

ipv6 버전..? 내가 내꺼에 글쓰면 저렇게 표시됨

 

다른사람 게시판에 글을 쓰면 ip주소가 찍힘

 

 


설정 - 업데이트 및 보안 - window 보안 - 방화벽 검색

 

 

내꺼로 들어오는건 인바운드

밖으로 나가는건 아웃바운드

 

 

 

80포트 열겠다

 

 

 

 

 

 

 

완료되면 80에 V표시

 

 

 


dto 에서 bip변수 선언 

 get/set 해주고

 

컨트롤러에서 ip 가지고 db로 보내기

 

db에도 ip 저장하는 공간 만들어줘야함

 

 

board-mapper.xml 파일에서 sql문을 수정해야함 (db에 저장된 bip도 불러와야징)

게시판에 글을 써보면 이제 ip주소를 가진채로 저장된다

 

detail.jsp 파일에서 db에 저장된 ip 불러오기

게시판에 글을 쓰면

 

 

 


ip주소를 숨겨보자

* 주의 *

.split () 사용해서 콤마(.)를 기준으로 잘라줄건데 그냥 콤마는 인식을 못함

그래서 [.]  혹은 \\. 의 형태로 입력해줘야함

 

.repalce() 

.join() 

 

아래처럼 if문으로 조건식 추가해주기

ip 주소가 null 이 아닐때 실행 & ip주소에 콤마가 포함되면 실행 

                                                   => ip주소에 콤마가 포함되어 있지 않은게 아니라면

컨트롤러에서 content랑 같이 가져온 ip 빼주면


* (로컬호스트) 주소값이 아래처럼 들어오는 경우에는 아래 조건식으로도 가능하지만

저런 형태가 아닐 수도 있음! 

그래서 콤마 여부로 조건식 설정해 주는게 더 정확!


com.phyho.pro1 패키지 아래에

Utill.java 클래스 생성

> @Component 선언

 

지금까지 역할에 따라 이름 달아줬는데 Controller, Service, Repository

이번에는 Component ( = 객체 ) 사용해보자

객체화 시키기 위해 사용하는 애

 

ip를 가져오려면 HttpServletRequest 필요

파라미터로 적어주면 가능하긴 한데 강제로 적어준다고요????

 

 

request를 사용하기 위해 요렇게 길게 가져온건데 이게 뭐죠?

 

HttpServletRequest request 

= (

          (ServletRequestAttributes)

         RequestContextHolder.currentRequestAttributes()

         ).getRequest();

 

 

BoardController 에 있던 '상대방 ip 가져오기' 부분을 Utill에 넣어주기

=> 다른곳에서도 사용할 수 있게 (재활용 할 수 있게)

마지막에 return ip  빼먹지 말고!!!

 

BoardController 에서

> @Autowired 로 Utill 하고 연결

 근데 Utill 이여서 Util 로 수정해줌

 

 

 

그러면 이제 다른 사람 게시물에 글을 쓰면 내 ip 공개

내 게시판에 글을 쓰는 사람의 ip주소도 공개!

 

 


 

제목에 <> 를 포함해서 글을 쓰는 경우 막아보자

<    =>  &lt;   

>    =>  &gt;

부등호 대신 표현식으로 대체해주기

 

 

.contains()

.replaceAll() 사용

* 주의 * 

처음에 if로 < 요만큼을 바꿔주고 else if 로 > 요만큼에 대해서 대체되도록 설정해줬더니

제목에 < > 괄호 두개가 같이 포함되는 경우에는 앞의 괄호만 바꾸고 실행이 멈춤!!

각각에 대해 적용되도록 둘다 if 조건문 적용해줌

 

게시판 글쓰기에서 제목에 괄호  쓰면

 

바뀜!!!!!!!!!!!!!

 

(요렇게 if문이 없어도 가능)

	public void write(BoardDTO dto) {
		
		// btitle을 꺼내줍니다.
		String str = dto.getBtitle();
		
		// 값을 변경하겠습니다. replace()  <  =>  &lt;	  >  =>  &gt;
		str = str.replaceAll("<", "&lt;");
		str = str.replaceAll(">", "&gt;");
		
		dto.setBtitle(str);
		
		boardDAO.write(dto); 
	}

 

 

매번 이렇게 코드를 작성해줄수는 없으니

한 번 만든 코드를 계속 활용하려면 Util에 넣어주고 재사용

Util.java 에 만든 코드 넣어주기

 

str을 괄호방향에 따라 두번 불러오게 되니까 비효율적

더 빨리 처리되도록 하려면???

 

암튼 str.replaceAll("<", "&lt;").replaceAll(">", "&gt;");  => 요런형태로 한꺼번에도 가능

이제 str(title)이 Util에 있는 exchange() 메소드를 거쳐서(괄호를 변경해주는 과정을 거쳐서)

다시 str(변경적용된title)로 들어옴

더 줄여서 써보면

 

컨트롤러에 타이틀, 컨텐츠 가져오는거 아래에 적어줬었던

ip를 가져오는것도 서비스로 옮겨줌

 

어차피 컨트롤러에서 write() 메소드를 통해 title, content, writer 3개의 값이 담긴 dto를 서비스로 보내고

서비스에서 dto를 받아 title변경후 다시 title로 저장, ip는 새로 추가되는 값이니까 총 4개값이 dto에 담겨짐.

 

정리하자면 

get화면 (글쓰기 화면) 에 글을 쓰고 글쓰기 누르면 (post로 보내)

title, content를 request로 받아옴.

boardService.write() 로 서비스에게 던져줘 

 

서비스에서는 그 dto를 받아서 => title 작업 처리 & ip 값 추가 =>  dto를 DAO로 보내

DAO에서 그걸 받아서 명령문 실행

 


https://www.iconfinder.com/

 

7,600,000+ free and premium vector icons, illustrations and 3D illustrations

Iconfinder is the world's largest marketplace for icons, illustrations and 3D illustrations in SVG, AI, and PNG format.

www.iconfinder.com

 

수정 & 삭제 버튼 넣어주기

수정 & 삭제 아이콘 눌렀을 때 함수 del() 가 실행되도록 연결 

삭제 버튼 누르면

확인누르면


 

 


bno 가 121로 고정이 아닌 

해당 글번호가 나온다

 

소스코드에서 보면 이미 숫자가 들어가 있음

서버에서 이미 숫자로 바뀐 후에 스크립트가 작동해서 브라우저 화면에 보임  

 

 

이제 삭제 버튼 누르면 삭제 적용되게 만들자

 

BoardController 에서 

delete() 생성 => 페이지 삭제 시킬거 

 

 삭제 완료하면 board로 이동 (redirect)

 

두번째 방법은 @RequestParam

154번 글에서 삭제 버튼 누르면 콘솔창에 뜬다

 

더 명확하게 하려면

"bno" 라는 값을 가져와서 int bno 에 담아!!

이제 서비스 적어주자

 

추후에 사용자만 삭제할 수 있도록 만들어준거

delete ( ) 밑줄 클릭해서 서비스에 delete () 메소드 생성

다시 delete ( ) 밑줄 클릭해서 DAO에 delete () 메소드 생성

sqlSession에게 delete 실행하라고 시킬건데 관련정보(어떤 bno인지)는 dto를 봐라

 

이제 최종적으로 명령문을 db로 보낼 board-mapper 파일로 가서

이제 삭제버튼 누르면 글이 지워진다 야호

 

 

주소창에 아래처럼 입력하면 151번 글이 삭제됨

http://localhost/delete?bno=151 

 

 

그런데 http://localhost/delete 만 입력하면( 위에서 설정해준 bno 값이 없으면) 아래처럼 error가 난다

 

요거를 처리하기 위해 아래처럼 입력해주면 board 페이지로 이동함

 

required를 거짓으로 놓고(기본값이 참) default값을 0으로 넣어줌.

delete가 실행되면 (게시판에는 0번글이 없으니 아무것도 지워지지 않은채로)  보드 게시판으로 넘어감

 

 

* 번외 *

util 에서 가져온 ip를 콘솔에 출력할 수 있음

(내 글을 누군가가 눌렀을 때 어떤 ip주소에서 눌렸는지 확인가능)