728x90

어노테이ㅏ션으로 바꾸기

messageBeanImpl은 사진 처럼 값을 넣어주고
오토와이어를 걸어준다
어노테이션으로 바꿀려면 xml을 지워야 하는데 거기서 aspect라고 알렸었는데 어노테이션으로 바꿔도 알려야 한다

그걸 loggingAdvice클래스에서
사진처럼 한다

5줄이 @Aspect 한줄로 바뀐다
aop:config부분은 사진처럼 바뀐다
이렇게 변한다
그리고 xml에 aspect를 어노테이션으로 쓰고 있다는 것을 알려야 한다.

 

@EnableAspectJAutoProxy는 xml파일에서
<aop:aspectj-autoproxy/>를 대신하는 코드이다
   

 


 
leader부분에서
MssageBeanImpl 클래스를 읽어올 수 있게 한다
인터페이스가 여러개면 배열로 넣으면 된다.
구현부에는 사진처럼 작성하면
익명클래스가 들어온다.

프록시를 처리할 수 있도록 핸들러를 만들어야 한다
 
   
   

 

1번과 2번은 같은내용이다 둘중 하나만 사용하면 된다
이건 다른파일에 DB에 연결하는 긴 문구를 따로 적어두고
네임스페이스를 사용하는 방법이다

${}를 사용할려면 참조하는 파일 위치를 알려줘야 한다

3가지 방법중 1개를 사용하면된다.

   
*JdbcTemplate

데이터베이스와 연동하기 위해 드라이브를 로드하고,
커넥션 객체를 가져와 연결하고,
자원을 해제하는 단계를 계속 반복하여 코드로 작성해야 하는 JDBC의 단점 때문에

스프링에서는 JdbcTemplate을 제공해준다.

   
전에는 impl
DB의 동작들을 템플릿이 해준다.

그래서 템플릿한테 커넥션풀을 줘야 한다.
위에 위에 사진에서 처럼 생성하고 값넣고 생성 하는걸

*JdbcTemplate가 대신해서 다한다.

https://blog.naver.com/rjh4820/221962598895
   
jdbc템플릿을 빈으로 설정하지 않고
스프링이 만들어서 제공하게 만들기

(사진처럼 안하기)

JdbcTemplate와NamedParameterJdbcTemplate는 상속관계

NamedParameterJdbcDaoSupport안에 
NamedParameterJdbcTemplate가 있다


xml에서 JdbcTemplate를 직접 bean으로 생성하지 않고

상속받아서 사용할 것이다.
아래처럼 상속을 이용한다.
상속하고 있는 NamedParameterJdbcDaoSupport클래스의

getJdbcTemplate() 메소드를 이용한다
getJdbcTemplate() 메소드안에 dataSource가 있기 때문에
xml에서 따로 뭐 생성을 안해줘도 property로 값을 받을 수 있다.

1번은 2번클래스에 setter를 찾는데 거기에 setter가 없다
근데 2-1을 보면 3을 상속받고 있는데
3번은 스프링에서 제공하고 있고 그 클래스 안에는 
1번에 대한 setter가 있기 때문에 정상작동한다
UserDAOImpl 클래스에서

getJdbcTemplate() 사용하면 2,3번을 사용해야 한다

3번방법에서는 ?는 헷갈릴수 있어서 알아보기 쉽게 :name 처험 쓴다
   
 
   

DB와 연결을 좀더 쉽게 하기 위해 설정을 미리 잡아두는게 커넥션풀

커넥션풀을 관리하는건 데이터 소스(DataSource)


자바와 DB를 분리해서 xml에서 DB를 관리하는걸 ORM이라고 한다
mybtis를 사용
   
수정부분
queryForObject()??
BeanPropertyRowMapper<>();????


 

???

https://github.com/benelog/spring-jdbc-tips/blob/master/spring-jdbc-core.md

 

benelog/spring-jdbc-tips

Spring JDBC 활용팁, SQL 관리 방안 등. Contribute to benelog/spring-jdbc-tips development by creating an account on GitHub.

github.com

 


 
property가 setter이기 때문에 위에서 set으로 받는다
   
  생성자는 빈을 만들면 자동으로 들어오기 때문에 오토와이어가 피료없다

set은 이름에 set이 붙기 때문에 자동으로 찾을 수 없어서 오토와이어를 붙어야 한다
 
728x90

'Spring' 카테고리의 다른 글

web, WEB-INF 차이점  (0) 2021.08.24
(추가 필요@RequestBody )@ResponseBody, @RequestMapping, @RequestParam, @ModelAttribute  (0) 2021.01.09
1/06 스프링 chapter06  (0) 2021.01.06
1/04 스프링  (0) 2021.01.04
12/30  (0) 2020.12.30
728x90

chapter02_SpringMaven 프로젝트의
sample03

SungJukDTO클래스랑 SungJukImpl클래스에

@Component, @ComponentScan 둘다 주석

applicationContext.xml에서 
SpringConfiguration연결 부분만 

이유: 왜?
오류안남
@Component, 

applicationContext.xml에서 
SpringConfiguration연결 부분

이유: Component가 자동으로 bean생성해줘서?
근데 xml에서 어노테이션을 쓰는걸 못찾을 텐데?
오류안남
@ComponentScan 

applicationContext.xml에서 
SpringConfiguration연결 부분

이유: @ComponentScan 을 썼고 
그곳에 빈을 생성해서
오류안남
     
@Component, @ComponentScan 둘다 주석걸고
applicationContext.xml에서 
sample03 연결 부분만 활성화 하면

이유: 빈이 없으니까 값을 찾을 수 없어서
오류
@Component

applicationContext.xml에서 
sample03 부분만 활성화

이유: xml에서 어노테이션을 쓴다했고
Component이 알아서 빈을 생성해줘서
오류안남
@ComponentScan 

applicationContext.xml에서 
sample03 부분만 활성화

이유: xml에서 어노테이션을 쓴다고 알렸는데
ComponentScan 는 spring.conf에 빈을 생성하는데 거기가는 길을 안알려 줬으니깐
오류

@Component를 쓰면 안보이게 bean생성

@ComponentScan("클래스명") 을 쓰면 관리하기 쉽게 한 클래스에 빈 생성

 


메이븐 sample5번에서 componentScan을 안쓰는데 왜 <context.component-scan~>가 없으면 에러나는지?

@Component를 쓰니까 자동으로 bean을 만들고 있어서 에러가 안나야 하는데? 


 

728x90
728x90
728x90

'CSS' 카테고리의 다른 글

css를 이용한 스프라이트 기법  (0) 2021.04.13
css 기억해야할거(선택자)  (0) 2021.03.21
CSS3 position  (0) 2021.03.20
CSS2, 삼각형그리기(border), float, position  (0) 2021.03.18
12/29  (0) 2020.12.29
728x90

web.xml파일에 선언한 <servlet>태그는 HttpServlet을 상속받고 있는 클래스를 web.xml에 등록할 때 사용한다.
그리고 web.xml파일에 <servlet>태그를 사용할려면 반드시 하위에 <servlet-name>과 <servlet-class>태그를 선언해야 한다.

<servlet-name>태그는 등록할려고 하는 서블릿에 이름을 부여하는 것이고
서블릿의 이름은 개발자가 지정해주는 것이다. 
서블릿의 이름을 지정해주고 나면 이후에는 클래스 이름을 사용하면 안돼고 지정해준 이름을 사용해야 한다.

<servlet-class>태그는 등록하는 서블릿의 실제 클래스 이름을 지정한다.

등록하는 서블릿의 위치.서블릿 이름 을 선언하면 된다.

<servlet-class>에 작성한 주소로 웹서버가 서블릿 객체를 찾아 올바르게 서블릿에 관한 설정을 할 수 있다.
웹서버가 서블릿을 찾아갈 때 사용하는 정보이기 때문에 정확하게 작성해야 한다. 

<servlet-mapping>태그는 web.xml에서 <servlet>태그로 등록한 서블릿을 실행 요청할때 사용할 URL을 지정하기 위해 사용한다.
이 태그는 <servlet>태그를 사용했을 때만 사용할 수 있고 <servlet>로 등록된 서블릿이 아니면 사용할 수없다.

<servlet-name>태그는 실행할 서블릿 이름을 지정한다.
이때 지정하는 이름은 반드시 <servlet>태그에서 등록한 서블릿 이름으로 지정해야 한다.
위의 사진으로 보면 web.xml파일의 6번줄에 선언한 이름을 16번에 사용해야한다.
만약 6번줄 처럼 <servlet>태그에서 등록하지 않은 이름으로 <servlet-name>을 설정하면 web.xml는 오류가 난다.
web.xml은 이정보를 가지고 <servlet>태그를 찾아 매핑한 다음 실제 서블릿 클래스와 연결된다.

<url-pattern>태그는 서블릿을 실행할 때 사용할 URL을 지정한다.
URL을 지정할 때 전체 URL정보를 모두 지정하는게 아니라 'http://서버주고:포트번호/웹 애플리케이션이름' 은 생략하고 그 다음인.~만 입력하면된다. 앞부분은 *로 작성하면 된다.
위사진의 web.xml파일을 보면 'http://서버주고:포트번호/웹 애플리케이션이름' 은 *로 대체하고 .do로 패턴을 선언했다.

 


위의 사진에선 7번줄에 작성한 경로에 위치한 서블릿의 이름을 6번줄에 ControlServlet로 선언했고
15번줄에 mapping태그에서 name을 통해 연결?하고 url패턴을 *.do로 선언해서
주소의 끝에 do를 쓰면 서블릿을 사용할 수 있도록 만들었다.


@WebServlet

@어노테이션은 자바에서 주석처럼 소스안에 @기호와 함께 사용된다.
컴파일러에게 정보를 알려주거나 자바 프로그램 실행에 관한 내용을 설정하는 용도로 사용된다.

어노테이션을 통해 접근하려면 서블릿의 클래스 선언부 앞에 @WebServlet(접근시 사용할 url)를 지정하면 된다.
사용하게 되면 javax.servlet.annotation.WebServlet; 클래스를 임포트해줘야 한다.

 

728x90

728x90

페이지 이동

jsp는 파일을 만들면 9개의 내장객체를 만든다.

여기서는 각jsp로 만든 페이지들을 이동하는 방법중에 sendRedirectforward를 이용하는 것을 할 것이다.

 


send~는 각각의 페이지의 rwquest와 response의 정보가 다르고 공유되지 않아서
aa.jsp에서 apple를 사과라 칭하고 bb.jsp에서 불러내면 
bb.jsp에선 aa에서 일어난 일을 모르기 때문에 null값이 나온다.
(앞의 페이지와 뒤의 페이지의 정보가 다른데)

forward는 앞의 페이지와 뒤의 페이지의 정보가 같다

네모는 데이터?가 공유하는 공간인데 저렇게 연결이 되면 bb의 request와 response는 사라지고
aa의 request와 response로 공유되서 사용된다.

그리고 aa에서 apple를 사과라고 하면 bb에서도 apple를 사과라고 인식할수 있다.
데이터가 공유된다는 이야기이다.

 


위 두개의 request는 다른 request이지만

아래의 의 request는 같은 request이다.

 

 


근데 12번줄은 이제 안쓰는 기술이다.

대신 9번 10번을 사용한다.

728x90
728x90

728x90
728x90

다음 API

 회원가입에 필요한 주소를 찾는 방법중 내가 생각하기에 가장 간단한 방법은 다음 api를 이용하는것이다.

http://postcode.map.daum.net/guide

 

Daum 우편번호 서비스

우편번호 검색과 도로명 주소 입력 기능을 너무 간단하게 적용할 수 있는 방법. Daum 우편번호 서비스를 이용해보세요. 어느 사이트에서나 무료로 제약없이 사용 가능하답니다.

postcode.map.daum.net

이 사이트에 들어가면 우편번호검색에 필요한 코드를 다운받을 수 있다.

먼저 회원가입에 필요한 폼을 html로 만들고 그 모양에 맞는 api를 다운받으면 된다.

먼저 내가 만든 회원가입 폼이다
이클립스에서 만들었다.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>회원가입</title>

</head>
<body>
 <form name="writeForm" method="post" action="http://localhost:8080/memberServlet/WriteServlet"> <!-- 비밀번호 들어가 있으니 POST 방식 사용  -->
 <h2>회원가입</h2>
 <hr>
 <table border="1" cellpadding="2" >
  <tr>
  	<td align="center" width="80">이름</td>
   	<td><input type="text" name="name" id="name" size="20" placeholder="이름입력">
   	<div id="nameDiv" style="border:1px red solid; color:red; font-size:8pt; font-weight:bold;"></div>
   	<!-- div 반응형에서 많이 사용 -->
   	</td>
   
  </tr>
  <tr>
    <td align="center">아이디</td>
   	<td><input type="text" name="id" id="id" size="20" placeholder="아이디입력">
   	<div id="idDiv" style="color:red; font-size:8pt; font-weight:bold;"></div>
   	</td>
   	
  </tr>
  <tr>
    <td align="center">비밀번호</td>
   	<td><input type="text" name="pwd" size="30"></td>
  </tr>
  <tr>
    <td align="center">재확인</td>
   	<td><input type="text" name="rePwd" size="30"></td>
  </tr>
  <tr>
	<td align="center">성별</td>
	<td><input type="radio" name="gender" value="0" checked>남
	<input type="radio" name="gender" value="1">여</td>
  </tr>
  <tr>
	<td align="center">이메일</td>
	<td>
		<input type="text" name="email1" size="15"> 
		@ 
		<input type="email" list="email2" name="email2" placeholder="직접입력">
		<datalist id="email2">
			<option value = "gmail.com">
			<option value = "naver.com">
			<option value = "daum.net">
		</datalist>
	</td>
  </tr>
  <tr>
  	<td align="center">핸드폰</td>
	<td>
	 <select name="tel1" style="width:60px;"> 
	  <option value="010">010</option>
	  <option value="011">011</option> 
	  <option value="017">017</option>
	 </select> 
	 -
	 <input type="text" name="tel2" size="5">
	  -
	 <input type="text" name="tel3" size="5">
	</td>
  </tr>
  <tr>
	<td align="center">주소</td> <!-- onclick은 무조건 javascript와 연결. 굳이 javascript 안 적어줘도 됨 -->
	<td><input type="text" id="postcode" name="zipcode" size="5" readonly>
	<input type="button" value="우편번호검색" onclick="checkPost()"><br>
	<input type="text" id="address" name="addr1" size="50" placeholder="주소" readonly><br>
	<input type="text" id="detailAddress" name="addr2" size="50" placeholder="상세주소"></td>
  </tr>
  <tr>
  	<td colspan="2" align="center">
   	<input type="button" value="회원가입" onclick="javascript:checkWrite()">
	<input type="reset" value="다시작성">
	</td>
  </tr>
 </table>
 </form>
 <script defer src="../js/member.js"> </script>
 <script src="https://t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"> 
 //js파일 하나 판 거 알려줘야 함 ↑
 //<script type="text/javascript"
 //내 파일 기준으로 .. <상위 파일
 </script>
</body>
</html>





 

모양은 이렇다

내가만든 주소창의 모양과 다음에서 제공하는 모양과 비슷한 api를 받으면된다.

이 사진에 있는 예제코드를 보면

<input type="text" id="sample6_postcode" placeholder="우편번호">
<input type="button" onclick="sample6_execDaumPostcode()" value="우편번호 찾기"><br>
<input type="text" id="sample6_address" placeholder="주소"><br>
<input type="text" id="sample6_detailAddress" placeholder="상세주소">
<input type="text" id="sample6_extraAddress" placeholder="참고항목">

<script src="https://t1.daumcdn.net/mapjsapi/bundle/postcode/prod/postcode.v2.js"></script>
<script>
    function sample6_execDaumPostcode() {
        new daum.Postcode({
            oncomplete: function(data) {
                // 팝업에서 검색결과 항목을 클릭했을때 실행할 코드를 작성하는 부분.

                // 각 주소의 노출 규칙에 따라 주소를 조합한다.
                // 내려오는 변수가 값이 없는 경우엔 공백('')값을 가지므로, 이를 참고하여 분기 한다.
                var addr = ''; // 주소 변수
                var extraAddr = ''; // 참고항목 변수

                //사용자가 선택한 주소 타입에 따라 해당 주소 값을 가져온다.
                if (data.userSelectedType === 'R') { // 사용자가 도로명 주소를 선택했을 경우
                    addr = data.roadAddress;
                } else { // 사용자가 지번 주소를 선택했을 경우(J)
                    addr = data.jibunAddress;
                }

                // 사용자가 선택한 주소가 도로명 타입일때 참고항목을 조합한다.
                if(data.userSelectedType === 'R'){
                    // 법정동명이 있을 경우 추가한다. (법정리는 제외)
                    // 법정동의 경우 마지막 문자가 "동/로/가"로 끝난다.
                    if(data.bname !== '' && /[동|로|가]$/g.test(data.bname)){
                        extraAddr += data.bname;
                    }
                    // 건물명이 있고, 공동주택일 경우 추가한다.
                    if(data.buildingName !== '' && data.apartment === 'Y'){
                        extraAddr += (extraAddr !== '' ? ', ' + data.buildingName : data.buildingName);
                    }
                    // 표시할 참고항목이 있을 경우, 괄호까지 추가한 최종 문자열을 만든다.
                    if(extraAddr !== ''){
                        extraAddr = ' (' + extraAddr + ')';
                    }
                    // 조합된 참고항목을 해당 필드에 넣는다.
                    document.getElementById("sample6_extraAddress").value = extraAddr;
                
                } else {
                    document.getElementById("sample6_extraAddress").value = '';
                }

                // 우편번호와 주소 정보를 해당 필드에 넣는다.
                document.getElementById('sample6_postcode').value = data.zonecode;
                document.getElementById("sample6_address").value = addr;
                // 커서를 상세주소 필드로 이동한다.
                document.getElementById("sample6_detailAddress").focus();
            }
        }).open();
    }
</script>

예제코드를 보니 주소입력을 하는 칸도 포함이 되어 있었다. 본인이 만든 회원가입 html에 맞게 합쳐주면 된다.

그리고 스크립트 부분도 넣어주면되는데 나는 js파일을 따로 만들어 스크립트 부분을 모아놨다.

이렇게 스크립트 부분만 떼어내서 js파일에 넣어주고

회원가입 폼에는

이렇게 입력해서 경로?를 알려준다. 저 부분을 쓰지 않는다면 writeForm은 스크립트부분이 어디 있는지 알수 가 없다.

그리고 이제 DB에 회원을 저장하기 위해 테이블을 만들어주는데 주소부분은 다음에서 받은 코드와 같은 변수명으로 만들어준다.

그리고 홈페이지를 실행해서 우편번호찾기를 누르면

이렇게 다음의 우편번호 서비스를 이용할 수 있게된다.



 

wdev를 이용하는 방법

먼저 우편번호, 주소를 입력할 DB 테이블을 만든다.

create table newzipcode (
zipcode varchar2(7),        --우편번호
sido varchar2(20),           --시도
sigungu varchar2(30),      --시군구
yubmyundong varchar2(20), --읍면동
ri varchar2(20),               --리
roadname varchar2(100),  --도로명
buildingname varchar2(100) --빌딩명
);


우편번호 API를 이용하는 방법은 여러가지가 있지만 지금은 이 사이트의 api를 이용해본다.

http://www.wdev.co.kr/zip/data.asp

 

도로명주소 우편번호

우편번호 자료(개발자용) 가장 최근 자료를 다운로드하여 사용하시면 됩니다. (이전 자료는 참고용, 필요한 경우만 받으세요) 최근자료 10개가 기본으로 나옵니다. 전체 자료를 보시려면 이곳을

www.wdev.co.kr

홈페이지에 들어가 사진에 있는 것 처럼 all이라고 써있는걸 받으면 된다.

 

파일을 받았으면 압축을 풀어준다.

그 안에 텍스트 파일이 있는데 한국의 모든 주소가 적혀 있다. 이 안에 있는 데이터를 DB에 저장해서 DAO클래스를 이용해 사용할 것이다.

먼저 텍스트 파일을 엑셀에서 모든 파일 타입으로 연다. (모든파일로 안바꿔주면 파일이 안보인다.)

아래 사진처럼 해주고 마침을 누르면 시간이 좀 걸려서 생겨난다.

그다음은 그냥 마침하고 끝낸다.

파일이 생성되고 나면 roadcode부분은 필요없으니깐 삭제해준다

 

그리고 저장은 아래 사진처럼 이름을 바꾸고 파일형식은 csv로 바꿔서 저장해준다

 

다음은 ctl파일을 작성할 건데 메모장을 켜서 아래의 글을 붙여넣고

load data
infile 'D:/jave_ee/lib/newzipcode.csv'
insert into table newzipcode
fields terminated by ","
trailing nullcols
(zipcode,
sido,
sigungu,
yubmyundong,
ri,
roadname,
buildingname)

파일 이름은 newzipcode.ctl로 작성하고
파일 형식은 모든파일
경로는 C:\app\bitcamp\product\18.0.0\dbhomeXE\bin\newzipcode.ctl에 해준다.

 

그다음은 sqldeveloper에 들어가서 임포트 해주면 된다.

사진처럼 들어가서 데이터 임포트를 해준다.

 

728x90

+ Recent posts