국비과정/Spring

20230818 _[53일차]_01. 스프링부트 myinfo & notice & admin 페이지

phyho 2023. 8. 18. 18:19

 

시험봤다.


[Spring] 개론 (tistory.com)

 

 

[Spring] 개론

1. Spring 프레임워크의 특징1.1 DI(Dependency Injection) / Ioc(제어역행) : 기존의 프로그램은 객체를 소스에서 정의하고 생성한다. 객체를 소스에서 직접 생성하지 않고, 스프링 프레임웍이 객체를 생성

oasispapa.tistory.com

 


JAVA 암호화와 복호화 Cipher (tistory.com)

 

JAVA 암호화와 복호화 Cipher

먼저 암호화라는 개념은 너무나 간단합니다 내가 가진 원문의 메세지를 상대방이 해석할 수 없게 하는 것이 바로 암호화의 목적 javax.crypto.Cipher 클래스는 암호화 알고리즘을 나타낸다. 암호를

hongik-prsn.tistory.com


menu.jsp 에서 

myinfo를 눌렀을때 주소창에 @id 가 뜨도록 설정해줬었다.

LoginController 에서

@PathVariable 사용해서 주소창에 설정해준 id를 잡아온다.

그러면 메뉴바에 myinfo 를 클릭했을 때

아래처럼 로그인한 사람의 id (주소창의 @뒤의 id)를 잘 잡아온다.

주소창에서 잡아온 id와 로그인한 계정의 id가 일치하는지 확인해보면 true가 나온다.

string 타입 비교는 .equals()

 

현재 로그인한 id는 PYOPYO인데 

다른아이디인 pororo 로 주소창에 입력해서 접근해보면 두 id의 일치여부는 false가 나온다.


일단 datail.jsp 완성해준다.

<style type="text/css">
#main{
	margin: 0 auto;
	width:95%;
	margin-top: 60px;
	color: black;
}
#detail{
	background-color: white;
	margin: 0 auto;
	width: 90%;
	height: auto;
	margin-top: 15px;
	color: black;
	padding: 10px;
	box-sizing: border-box;
}
#detailH{
	height: 40px;
	line-height: 40px;
	font-size: x-large;
	border-bottom: 1px solid black;
	box-sizing: border-box;
	overflow: hidden;
}
#detailIdDate{
	height: 50px;
	line-height: 30px;
	background-color: #D3D3D3;
	border-bottom: 1px gray solid;
	padding:10px;
	box-sizing: border-box;
}
#detailID, #detailDate{
	width: 45%;
	float: left;
	text-align: left;
}
#detailDate{
	float: right;
	text-align: right;
}
#detailContent{
	padding:10px;
	min-height:300px;
	height: auto;
	border-bottom: 1px solid white;
	box-sizing: border-box;
	text-align: left;
}
</style>

m_name을 mb_name으로 불러와서 오타가 났었다. 조심조심

암튼 컨트롤러에서 mbdetail() 메소드를 실행시켜서 해당 mbno에 대한 데이터값들을 가져온다.

멀티보드에서 글을 클릭해보면

'

datail.jsp에서 불러온 글제목, 글내용 등등이 잘 뜬다.

 


다시 myinfo로 돌아와서 

위에서 잡았던 id를 가지고 컨트롤러에서 처리하는 로직을 만들자.

ModelAnsView를 사용할건데 아래처럼 바로 "myinfo"를 넣어줘도 되고

myInfo가 아니라 myinfo ****

ModelAnsView 객체를 생성한 이후에 

setViewName을 통해 "myinfo"를 넣어줘도 된다.

id를 매개변수로 myInfo() 메소드를 실행시키고 

결과값을 myInfo에 담아 이걸 mv에 "my"라는 이름으로 붙여서 myinfo(jsp) 페이지로 보낼예정

 

서비스에서도  myInfo() 메소드를 실행

DAO에서도 myInfo() 메소드 실행

mapper에서는 매개변수로 가져온 id를 비교해 일치하는 회원정보를 불러오는 쿼리문 실행

myinfo.jsp에서 아래처럼 데이터를 뽑아와서 출력해보자.

데이터들을 mv에 "my"라는 이름으로 넣어줬었다.

MYINFO 메뉴를 눌러보면 사용자 정보가 잘 뜬다.


하이디에서 notice 테이블 생성

m_no 외래키도 설정해준다.

근데 NULL허용을 반대로 했다. 다시 설정해주고 저장 **

그리고 공지글 하나를 넣어준다.

이제 넣어준 글을 가져오는 notice 로직을 만들자 

컨트롤러, 서비스, DAO, mapper 생성하고 연결해주기

이제 컨트롤러에서 로직 만들어주자.

list() 메소드를 실행시킨 후 결과값인 list를 Model에 붙여서 jsp로 보내자.

서비스에서도 list() 메소드 실행시킨다.

아래형태가 원래의 형태고

축약형태는 

DAO에서도 list() 메소드 실행

mapper에서는 notice의 모든 정보를 다 가져오는 쿼리문실행

잘 출력된다.

 


 

스프링 웹프  책 p.488 에 파일 업로드 방식이 있는데 다른 방식으로 진행할 예정이다.

일단은 관리자 페이지를 만들자.

 

아래처럼 경로를 좀 더 길게 만들어줄거다.

AdminController 생성하고 아래처럼 설정해주면

admin폴더안에 index.jsp를 생성해줘야 한다.

index페이지도 생성해주면

주소창에 admin/admin을 입력해야 index페이지로 이동한다.


index.jsp 페이지는 쌤이 주신걸 가져와보자 

style에서 


(참고만 해두자)

main {

 

       height : 100vh        =>  %와 다르게 parent 요소에 영향을 받지 않는다

...

}


암튼 img도 가져와서 넣어주면

login은 배경, robot은 로그인창 위의 이미지~

그러면 이렇게 적용이 된다

 

form을 제출하면 ./login 으로 넘어가는데 

아래처럼 admin이 붙어있기 때문에 기존에 있던 login과는 충돌하지 않는다.

이제 컨트롤러에서 로직만들어주자

매번 admin을 써줄 필요없이 아래처럼 설정해준다.

이제 admin 페이지에서 

id랑 pw 입력하고 로그인 버튼 눌러서 form을 제출해주면

값이 map에 담겨서 잘 출력된다.

 

이제 위에서 잡은 id & pw 값을 db로 가져가서 

해당 계정과 일치하는 값의 갯수(count), 이름, 등급을 가져온다.

컨트롤러에서 result에 받아서 출력해보면 잘 나온다.


하이디에서 

TININT -> INT로 바꿔준다.

 

그러면 m_grade 값이 제대로 나온다.


이제 위에서 가져온 count값이 1이고, m_grade 값이 5 이상일때만 진행하는 if조건문을 만들어준다.

count값은 string 타입이라서  .equals() 를 사용해서 비교해주고

m_grade는  Object -> String -> Integer 순서로 캐스트해준다.

 

한번 테스트로 출력부터 해보자

count 값 비교하는것도 true가 나와야 하는데 뭔가 잘못됐다.

 

count값도 Object -> String  순서로 캐스트 해주고

count의 값인 1도 string타입이니까 따옴표를 붙여서 "1"로 비교해준다. 

equals는 string값들끼리의 비교!

 

그럼 id 와 pw를 입력하고 로그인을 했을 때 

그 계정이 db에 존재하고(count값이 1)  & 등급이 5 이상이라면

"진행" 문구가 콘솔창에 출력된다. 

 

이제 캐스트 과정을 util로 넘겨주자

 

result.get("count") 요부분만 int 타입으로 바로 사용할 수 있도록 

util에서 Object -> String -> Integer  변환해주는 메소드를 만들어서 처리해준다.

그럼 컨트롤러의 조건문에서는 result값(obj타입)에 util의 메소드만 실행시켜주면 된다.

 

return하는 주소창 수정해주고

session도 사용해보자.

이제 조건문을 만족한다면 

id, name, grade를 각각 mid, mname, mgrade 라는 이름으로 세션에 담아서 메인 페이지로 이동한다.

이때 id는 map에서 가져와야 한다. (id를 map에 담아 가져간 후에 쿼리문 실행 결과값을 result에 담았었다.)

result에는 count, name, grade 값만 들어있다.

슬러시 요청에 대해서는 admin 메인 페이지로 가도록 설정해준다.

아래처럼 표현해줄수도 있다.