728x90

- 기초 용어

smtp : 인터넷에서 이메일을 보내기 위해 이용되는 프로토콜이다.

 

간이 전자 우편 전송 프로토콜(Simple Mail Transfer Protocol)이라고 불린다.

사용하는 TCP 포트번호는 25,465,587번이다.

 

https : https를 이용한 인터넷 접속은 기존 http프로토콜에 더해서 보안프로토콜인 SSL 혹은 TLS를 이용하여 클라이언트와 서버간 보안성있는 데이터 왕래를 하게 해줍니다.

 

SSL,TLS : 보안 프로토콜이다. 

SSL TLS 는 응용계층(HTTP,FTP,SMTP)과 전송계층(TCP) 사이에 보안 계층이라는 독립적인 프로토콜계층을 생성하고,

위치합니다.

SSL 암호화 통신은 비대칭키방식으로 암호화에 사용할 키를 교환하고, 대칭키 방식으로 데이터 통신을 한다.

TLS가 SSL의 후속버전이긴 하지만,  두가지 전부 같은 의미이다.

 

- 기본설정

 

pom.xml

1
2
3
4
5
6
7
8
9
10
11
12
<!-- javax.mail -->
        <!-- https://mvnrepository.com/artifact/javax.mail/mail -->
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4.7</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${org.springframework-version}</version>
        </dependency>
cs

6: mvnrepository에서 JavaMail API (compat) 을 의존성에 추가한다.

최신버전은 1.5.0-b01 이지만, 1.4.7 , 1.4 버전이 주로 사용된다.

 

root-context.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<!-- 회원가입 메일 인증 -->
    <bean id="mailSender"    class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="smtp.gmail.com" />
        <property name="port" value="587" /><!-- 465 or (25비추 평문) or 587 -->
        <property name="username" value="1234@gmail.com" />
        <property name="password" value="12345" />
        <property name="defaultEncoding" value="utf-8" />
        <property name="javaMailProperties">
            <props>
                <prop key="mail.transport.protocol">smtp</prop>
                <prop key="mail.smtp.auth">true</prop>
                <prop key="mail.smtp.starttls.enable">true</prop>
                <prop key="mail.debug">true</prop>
            </props>
        </property>
    </bean>
cs

servlet-context.xml 이 아닌 root-context.xml 에  bean을 등록한다. ( root-context.xml은 웹뷰와 관련 없는 bean을 처리 )

4 : 포트번호를 SMTP 평문 포트번호인 25번이 아닌 다른 포트번호로 지정해주었다.

( 사실 본 내용에서는 서버->구글로 전달되는 방식만 정해주는 것이기에 그렇게 보안설정이 중요해 보이지는 않는다. )

5~6 : 서버에서 사용할 구글 아이디 , 비밀번호가 각각 들어간다.

12 : STARTTLS 를 true로 놓아 상호간 TLS버전을 통일시 하도록 한다.

 

SSL과 TLS를 지원하는 포트에 연결되거나, 안전하지 않은 연결이 STARTTLS에 의해 업그레이드되면,

서버,클라이언트양측은 이 중에 지원되는 특정 버전을 쓰도록 합의합니다. 서버가 최신의 TLS v1.3을 지원하더라도, 이메일 클라이언트가 TLS v1.1만 지원한다면, 양측은 TLS v1.1을 쓰게 된다는 겁니다.

 

구글내 설정

보안 수준이 낮은 앱의 액세스를 허용해야 spring 에서 구글 smtp 서버에 접속할 수 있다.

 

-SPRING 에서 활용하기

 

하단의 샘플은 이메일인증키를 사용자에게 발송하는 로직을 가진 서비스.java 파일이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
import java.util.Random;
import javax.inject.Inject;
import javax.mail.MessagingException;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;
import javax.servlet.http.HttpSession;
 
@Service
public class userinfoServiceImpl implements userinfoService{
    
    @Inject
    private userinfoDAO dao;
    @Inject
    private JavaMailSender mailSender;
 
    ~~ 생략 ~~
 
    @Override
    public void createEmailKey(HttpSession session,String usermail) {
        String strKey=getKey(8);
        session.setAttribute("authenticationKey", strKey);
        session.setMaxInactiveInterval(60*3);
        MimeMessage mail=mailSender.createMimeMessage();
        String htmlStr="<h2>안녕하세요 TodaysFortune 웹사이트 입니다! </h2><br><br>" 
                + "<h3>회원님의 가입을 환영합니다<h3>"
                + "<p>이메일 인증 코드 : " 
                + "<span style='color:red;'>"+strKey+"</span></p>"
                + "(혹시 잘못 전달된 메일이라면 이 이메일을 무시하셔도 됩니다)";
        try {
            mail.setSubject("[TodaysFortune] 인증메일입니다.""utf-8");
            mail.setText(htmlStr,"utf-8","html");
            mail.addRecipient(RecipientType.TO,new InternetAddress(usermail));
            mailSender.send(mail);
        } catch (MessagingException e) {
            e.printStackTrace();
        }
 
    }
 
    ~~~ 생략 ~~
}
cs

14~15 : root-context.xml 에서 정의한 bean을 주입시켜준다.

24 : MimeMessage 객체를 생성해준다.

31 : 메일의 제목.

32 : 메일의 본문

33 : 메일 수신자 설정.

34 : 실제 메일 발송.

 

하단은 daum 홈페이지에서 수신된 이메일이다.

 

참고 : SSL,TLS,HTTPS정리사이트 https://blog.naver.com/skinfosec2000/222135874222

        STARTTLS 원문번역사이트 https://tech.yeon.me/blog/ssl-tls-starttls%EC%9D%98-%EC%97%AD%EC%82%AC/

        서브 OKKY 참고자료 https://okky.kr/article/329317?note=1834311

        spring javaxmail 참고자료 http://blog.naver.com/vnemftnsska2/221413314636

       

추후 볼만한 사이트 : 이미지,파일,대량의 메일을 전송하는방법 https://offbyone.tistory.com/167

728x90

ajax는 비동기식 뿐만 아니라 동기식으로 처리해야할 경우도 생긴다.

대표적인 경우가 ajax 결과를 또다른 함수에서 리턴받아 이어서 작업해야하는 경우이다.

요점으로는,

1. async=false 로 지정해주어야 하며 ,

2. 콜백함수단위에서 데이터를 리턴하는 것이 아닌 ajax 전체 펑션단위에서 데이터를 리턴해야 한다.

 

하단의 주소에서 이에 대해 자세히 설명해주고 있다.

https://recollectionis.tistory.com/167

'21년이전 > front-end' 카테고리의 다른 글

js - 숫자 앞에 0을 붙이기  (0) 2021.06.06
js - var, let , const  (0) 2021.06.06
front - modal  (0) 2021.06.04
css - box-shadow  (0) 2021.06.03
html - input type  (0) 2021.06.03
728x90

- 구현 

 

하단은 html modal샘플이다

1
2
3
4
5
6
7
8
9
<!-- modal -->
<div class="modal hidden">
  <div class="modal__overlay"></div><!-- 외부클릭시 닫을 용도 ,외부색깔담당 -->
  <div class="modal__content">
    <div id="modal__text">사용 가능한 아이디입니다.</div>
    <button class="modal-button" style="background-color: #2E9AFE;" id="modal_close">OK</button>
  </div>
</div>
<!-- //modal -->
cs

하단은 modal 전용 css 이다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
.modal {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
}
.modal__overlay {
  position: absolute;
  background-color: rgba(0, 0, 0, 0.6);
  width: 100%;
  height: 100%;
}
.modal__content {
  position: relative;
  top: 0px;
  box-shadow: 1px 10px 20px rgba(0, 0, 0, 0.19), 1px 6px 6px rgba(0, 0, 0, 0.23);
  width: 20rem;
  background-color:white;
  text-align: center;
  padding: 1rem;
  border-radius: 10px;
}
.modal-button{
    margin-top:0.2rem;
    padding:0.6rem 2rem;
    hegith:1.2rem;
    font: normal normal bold 1rem arial;
    color:white;
}
.hidden {
  display: none;
}
cs

17 : modal__content 클래스는 모달창을 설정한다.

해당 코드를 빌려다가 쓰는 사람의 경우엔 , modal__content 클래스의 box-shadow , width만 변경해서 사용하면 될듯하다.

 

하단은 javascript 코드이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<script>
~~~
openModal(); 
~~~
 
//modal
const closeBtn = document.getElementById('modal_close');
const modal = document.querySelector('.modal');
const overlay = document.querySelector('.modal__overlay');
const openModal = function(){
  modal.classList.remove('hidden');
}
const closeModal = function(){
  modal.classList.add('hidden');
closeBtn.addEventListener('click', closeModal);
overlay.addEventListener('click', closeModal);
</script>
cs

3 : openModal(); 을 원하는 자바스크립트 명령어 사이에 넣어주면 , 모달이 나온다.

 

하단의 이미지는 샘플 결과이다.

 

 

참고 및 수정 - https://github.com/eotkd4791/JavaScript/tree/main/Vanilla_JS/Modal

'21년이전 > front-end' 카테고리의 다른 글

js - var, let , const  (0) 2021.06.06
front - jquery ajax (동기식)  (0) 2021.06.04
css - box-shadow  (0) 2021.06.03
html - input type  (0) 2021.06.03
jsp - 태그 입력방지 , 줄바꿈 적용  (0) 2021.06.03
728x90

- box-shadow

지정 요소를 기준으로 그림자가 만들어지게하는 css 명령어

 

-문법 (  '()' 는 설명 ,  '[]'는 생략가능 표시 , 하단방향이 양의 y축방향이고 우측방향이 양의 x축방향입니다. )

box-shadow: offset-x(기준요소로부터의 x축거리 offset-y(기준요소로부터의 y축거리
   [blur-radius(블러되는 정도이지만, 그림자크기에 비례해 사이즈도 커짐)]   

[spread-radius(그림자의 크기에 비례)]    color(그림자의 색깔);

 

자주사용 되는 경우의 코드는 아래 두가지 경우일 거라고 생각한다.
1. box-shadow: offset-x offset-y blur-radius color;
2. box-shadow: offset-x offset-y blur-radius spread-radius color;

 

 콤마(,)를 이용한 명령어 구분으로 그림자 두겹도 된다..
box-shadow: 3px 3px red, -1em 0 .9em olive;

 

 

-추가가능옵션

 inset : 외부그림자가 아닌 내부그림자로 만듬

 

-글로벌 키워드(아직 안써봄)

box-shadow: inherit;
box-shadow: initial;
box-shadow: unset;

 

-참고

https://developer.mozilla.org/ko/docs/Web/CSS/box-shadow

728x90

-input type="tel"

pattern 와 함께 사용되어 010-1234-6867 같은 규약을 만들수 있다.

 

하단은 샘플이다

1
2
3
4
5
<form action="/action_page.php">
  <input type="tel" name="phone" placeholder="010-1234-5678" pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}" required><br><br>
  <small>Format: 123-45-678</small><br><br>
  <input type="submit">
</form>
cs

2 :  pattern 을 보면  [ ] 내부는 올 수 있는 숫자의 범위를 지정하고 , {}내부는 []에 들어올 수 있는 숫자의 갯수,

-는 숫자뭉치간 이어지는 약속표기이다.

 

하단의 이미지는 , 사용자가 규약을 지키지 않고 서버로 url을 요구할 경우( submit 버튼이 눌릴떄 ) 나타나는 에러이다.

참고 : https://www.w3schools.com/tags/att_input_type_tel.asp

'21년이전 > front-end' 카테고리의 다른 글

front - modal  (0) 2021.06.04
css - box-shadow  (0) 2021.06.03
jsp - 태그 입력방지 , 줄바꿈 적용  (0) 2021.06.03
html - Form 태그 바깥에서 Form 내부 데이터들 서버로 전송하기  (0) 2021.06.01
js - 속성선택자  (0) 2021.05.31
728x90

- 사용자의 태그 입력 방지

1
2
<c:set var="item" value="${fn:replace(server->client로 오는 객체,'<','&lt;')}" />
<c:set var="item" value="${fn:replace(item,'>','&gt;')}" />
cs

- 줄바꿈 적용 

client - > server로 줄바꿈이 저장될때는 "\n" 형태로 저장이 된다. 

client에서 줄바꿈을 나타낼때는 "\n"을 "<br/>" 로 변경해주어야 한다.

 

서버단 부분

1
model.addAttribute("enter""\n");//개행문자처리
cs

프론트단 부분

1
2
3
4
<c:set var="commentcontent" value='${fn:replace(객체,enter,"<br>")}'/>
~
<div style="width:90%;">${commentcontent}</div>
~
cs

 

참고로, textarea는 태그가 아예안먹고 줄바꿈도 자동으로 알아서 해준다.

div내부텍스트나 type="text"의 내부텍스트는 태그가먹음...
다만! div 나 type="text"더라도 value안에 텍스트를 넣으면 태그가 안먹게됨!

'21년이전 > front-end' 카테고리의 다른 글

css - box-shadow  (0) 2021.06.03
html - input type  (0) 2021.06.03
html - Form 태그 바깥에서 Form 내부 데이터들 서버로 전송하기  (0) 2021.06.01
js - 속성선택자  (0) 2021.05.31
front - textarea  (0) 2021.05.27
728x90

방법은 매우 간단하지만,  꼭 필요한 상황이 아니면 유지보수의 원활함을 위해서 지양하는게 좋을것 같다.

 form태그에 id를 지정해주고

form바깥에 있는 type="submit"을 가진 element에

해당 form의 id를 form속성을 만들어서 값으로 넣어주면 된다.

 

하단의 예시는 직접 사용해본 샘플이다.

1
2
3
4
5
<form id="clientToServerText" action="contentView/registerComment" method="post" onsubmit="return emptyContentCheck()">
                <input type="hidden" name="bidx" value="${itboardDTO.bidx}"/>
                <input type="hidden" name="currentPage" value="${currentPage}"/>
</form>
<input form="clientToServerText" type="submit" value="댓글등록" class="BlackWhite unloginSet"style="width:24%; height:6vh; font-size:1rem;"/>
cs

form 태그 외부의  submit 버튼이 잘 작동된다.

 

'21년이전 > front-end' 카테고리의 다른 글

html - input type  (0) 2021.06.03
jsp - 태그 입력방지 , 줄바꿈 적용  (0) 2021.06.03
js - 속성선택자  (0) 2021.05.31
front - textarea  (0) 2021.05.27
Front - (CSS) float  (0) 2021.05.02
728x90

- 단일 요소 선택

getElementById() querySelector() 

 

- 다중 요소 선택

getElementsByName()  getElementsByClassName() getElementsByTagName() querySelectorAll()


-형제 요소 선택

- nextSibling , nextElementSibling ( jquery의 after 역할을 하는 javascript 명령어 )

 

nextSibling 은 공백이나 줄바꿈도 하나의 노드로 인식하기 때문에 , 기준태그바로옆에 작성해야함..

이를 해결한, 다음 Element만을 선택하는 nextElementSibling 을 적용.

 

-부모 요소 선택

parentElement , parentNode 

둘다 같은 기능을 하지만, parentElement는 부모노드가 없을때 null을 리턴,

parentNode는 Document node를 리턴.

1
2
3
4
5
6
7
function replyComment(obj){
    if (loginCheck()==false ){
        return false;
    }else{
        obj.parentElement.nextElementSibling.classList.toggle("display_visible");
    }
}
cs

5 : 부모노드 . 다음형제노드 순으로 선택되며 클래스 토글이 된다.

 

-처음 자식 요소 선택

firstChild ,firstElementChild

처음 자식 노드에 접근한다.

nextSibling , nextElementSibling 차이와 동일하다.

firstElementChild는 오직 Element만 선택해준다.

 

하단은 삭제클릭 버튼 클릭시 onsubmit 이벤트를 발생시키는 html 파일이다.

1
2
3
4
<form onsubmit="return idmatching(this);" style="float:right;" class="relative-right unloginSet" method="post">
     <input type="hidden" value="${itboardDTO.id}"/>
     <button style="cursor:pointer;background-color: white;border:0;" type="submit" formaction="../itboard/contentView/delete">삭제</button>
</form?
cs

하단은 세션아이디와 아이템소유자아이디를 비교하는 샘플이다.

1
2
3
4
5
6
7
8
9
10
11
function idmatching(obj){
    var userID='${Session_userID}';
    var itemOwner=obj.firstElementChild.value;
    if(userID==itemOwner){
        return true;
    }
    else{
        alert('게시글 작성자만이 이용할 수 있습니다!');
        return false;
    }
}
cs

 

 

-클래스 읽기,추가,수정,삭제,토글, 특정 클래스가 포함된지 확인

아랫사이트에서 자세히 설명되어있다.

https://hianna.tistory.com/469

 

 

 

참고 : 다양한요소선택법

형제요소선택법

nextelementSibling

부모노드선택

자식노드선택

728x90

-mysql5.5ver+Spring 사용중  Mysql의 시간과 Spring 시간이 불일치하는 문제 발생-

원인예측 : Mysql에서 나의 특정 테이블의 특정 시간컬럼의 속성은 TIMESTAMP이다 .
TIMESTAMP의 특성상 기본적인 TIME_ZONE을 설정해주면 저장될때는 당연히 UTC 기반으로 저장되고 ,
출력 될때는 TIME_ZONE에 맞게 변형되어서 출력된다.  다만, 나의 경우에는 TIME_ZONE을 설정해주지 않아서 이상한 문제가 발생함.

 

TIMESTAMP에 대해 자세한 설명
https://mysqldba.tistory.com/268

첫번재 시도(실패) : 
dataSource의 url 경로에 serverTimezone=KST  을 설정하려함
이유 : pom.xml 의 mysql-connector-java version이  5.1.X 이후 버전부터   serverTimezone=KST 가 먹지 않음.  

두번재 시도(성공)
https://dogcowking.tistory.com/179 의 방법 2를 따라하여 serverTimezone값을 Asia/Seoul로 직접변경.


 

-SQLYOG 저장 쿼리복구-
Mysql이 중지후 재시작 되었을때 , SQLYOG 기본 쿼리들이 제거되고 ysav(세션 세이브포인트)만 남김.
C:\Users\username\AppData\Roaming\SQLyog 에 connrestore_backup.ysav  파일이 있으니 불러오기만 하면됨.(파일-오픈세션 세이브포인트)

728x90

-개요 이자 문제점

 

하단의 코드는 게시판을 삽입하는 *mapper.xml 코드이다. 

oracle에서는 아래처럼 하면 되지만 , mysql에서는 시퀀스 사용이 불가능하다.

( mysql 에서 그나마 사용 가능한 비스무리 한건 auto_increment 를 적용해서 nextval 효과를 내는것) 

1
2
3
4
<insert id="insertBoard" parameterType="ITboardDTO">
          insert into itboard (bidx,board_ref, ~~생략~~) values
         (itboard_bidx.nextval,(itboard_bidx.currval,~~생략~~)
</insert>
cs

 

나는 mysql 에서 오라클의 시퀀스(nextval,currval)의 기능을 이용하고 싶다.

 

-방법1   MAX(auto_increment적용된 컬럼) 이용

 

하단의 코드는 사전작업으로 , bidx라는 컬럼에 auto_increment 효과를 주었다. 

1
2
3
4
<insert id="insertBoard" parameterType="ITboardDTO">
          insert into itboard (board_ref, ~~생략~~) values
          ((select max(bidx)+1 from itboard),~~생략~~)
</insert>
cs

결과로는 bidx는 하나증가된 값을 가지고 , 

이와 같은 값을 board_ref 가 가지게 된다.

( 3번째줄의 (select max(bidx)+1 from itboard)  서브쿼리가 하나의 트랜잭션으로 독립적으로 취급된다면 

레이스 컨디션 상태라고 말할수 있겠지만 , 2~3줄을 합쳐서 하나의 트랜잭션인것 같다..  그러면 문제없음. )

https://droptable.tistory.com/33 ( 사이트를 보면 맨 밑 예시는 분명 레이스 컨디션이 발생할만한 상황이다 )

 

레이스 컨디션이라는 용어는 하단의 사이트에서 자세히 알 수 있다.

http://blog.naver.com/PostView.nhn?blogId=kojaejung&logNo=40109677766 

트랜잭션의 독립성은 하단의 주소를 보자.

 https://junghn.tistory.com/entry/DataBase기초-트랜잭션이란-무엇인가-Transaction 

 

 

-방법2    시퀀스테이블,시퀀스생성프로시져,함수  이용하기

 

그냥 MAX(auto_increment적용된 컬럼) 요거를 사용할 수도 있었지만 찜찜해서 방법2로 진행하기로 하였다.

 

하단의 샘플은 SQLYOG에서 작성한 쿼리문이고 , 게시글들을 카테고리별로 구별하여 curval,nextval에 이용하게 될것이다.

순서는 1 . 시퀀스테이블 생성 ,  2. 프로시져정의 3. 두개의 함수(nextval , curval) 정의이다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# mysql 에서  curval,nextval 구현하기
CREATE TABLE BOARD_SEQUENCES
(
    CATEGORY TINYINT(1)
  , CURRVAL BIGINT UNSIGNED
)
ENGINE = INNODB
 
DELIMITER $$
    CREATE PROCEDURE create_boardsequence(IN THE_CATEGORY TINYINT)
    MODIFIES SQL DATA
    DETERMINISTIC
    BEGIN
        DELETE FROM board_sequences WHERE CATEGORY = THE_CATEGORY;
        INSERT INTO board_sequences VALUES(THE_CATEGORY, 0);
   END
DELIMITER //
    CREATE FUNCTION `boardnextval` (THE_CATEGORY TINYINT(1))
    RETURNS BIGINT UNSIGNED
    MODIFIES SQL DATA
    DETERMINISTIC
    BEGIN
        DECLARE ret BIGINT UNSIGNED;
        UPDATE board_sequences SET currval = currval +1 WHERE CATEGORY = THE_CATEGORY;
        SELECT currval INTO ret FROM board_sequences WHERE CATEGORY = THE_CATEGORY LIMIT 1;
        RETURN ret;
   END
DELIMITER //
    CREATE FUNCTION `boardcurval` (THE_CATEGORY TINYINT(1))
    RETURNS BIGINT UNSIGNED
    DETERMINISTIC
    BEGIN
        DECLARE ret BIGINT UNSIGNED;
        SELECT currval INTO ret FROM board_sequences WHERE CATEGORY = THE_CATEGORY LIMIT 1;
        RETURN ret;
   END
CALL create_boardsequence('1');
cs

2~6 :    시퀀스 테이블을 정의 해주었다.   

9~16 :  인자로 들어오는 THE_CATEGORY가  BOARD_SEQUENCES테이블의  CATEGORY에 할당되며,

          BOARD_SEQUENCES테이블의  CURRVAL을 0으로 초기화 한다.

 

프로시져의 구성.

MODIFIES SQL DATA :
MODIFIES SQL DATA 는 함수혹은 프로시져가 db에 저장된 data를 수정할수있는 명령문을 포함한다는 것을 의미한다.
이것은 함수혹은 프로시저에 DELETE, UPDATE, INSERT, REPLACE 또는 DDL과 같은 명령문이 포함 된 경우 넣어준다.
DETERMINISTIC : 요약하면 함수혹은 프로시져의 인자값이 바뀌지 않는 이상 함수혹은프로시저의 호출은 한번만 한다는 것이다.

NO DETERMINISTIC 으로 설정한다면 조건에 따른 모든 경우에 함수 혹은 프로시져가 호출됨. 자세한 것은 하단의 주소를 참고한다.
http://intomysql.blogspot.com/2010/12/stored-function-not-deterministic.html 참고

프로시져를 생성하는 방법에 대해서는 하단의 주소를 참고한다.

https://m.blog.naver.com/alcmskfl17/221858522028

IN, OUT, INOUT 에 대한 설명은 하단의 주소를 참고한다.(어색하지만 잘 설명되어있음)

https://blog.duveen.me/14

 

17~27 : nextval을 구현한 함수이다.

          board_sequences 테이블에서 curval함수의 입력된 인자가 CATEGORY와 동일한 레코드를 찾아서,

          currval을 하나 증가시켜준다.

          25~26번째 줄은 증가된 currval을 리턴시키는 작업이다.

 

추가로 SELECT INTO reto ~  쿼리에서  INTO는 나온결과물을 reto에 대입시킨다는 의미이다. 자세한건 하단의 주소를 참고하자.

https://newpower.tistory.com/160

29~36 : curval을 구현한 함수이다.

37 : CALL create_boardsequence('1');  CALL을 붙여 프로시져를 호출하였다.

      시퀀스테이블에 CATEGORY=1, CURRVAL=0 인 레코드가 생성되었다. 

 

#사용법예시 INSERT INTO test (id,pw,NAME) VALUES ( boardnextval('1') , boardcurval('1'),boardcurval('1') );

예시의 결과레코드는  3개의 컬럼 모두 같은 값이 나온다.

 

이제 Mybatis  *mapper.xml 내용을 보자

1
2
3
4
  <insert id="insertBoard" parameterType="ITboardDTO">
          insert into itboard (bidx,board_ref, ~~생략~~) values
          (boardnextval(#{category}),boardcurval(#{category}), ~~생략~~ )
  </insert>
cs

3 : Mybatis+mysql 에서 sql function을 수행하는 것은 간단하다.  3번째줄 처럼 '함수명(#{인자})' 로 사용하면 된다.

결과는 내가 원하는 대로 나왔다.  bidx와 board_ref는 같은 값을 가지게 되었다.

 

mybatis+mysql 를 사용하는 환경에서 sql function 기능을 사용할때는 윗 방법대로 사용하면 되지만,

만약 sql 프로시져 기능을 사용하려 한다면 

태그 내부에 statementType="CALLABLE" 이라는 속성을 추가해 줘야 프로시져로 인식하여 프로시져를 수행한다.

옆사이트에 예시가 있다. https://krespo.net/164

 

 

 

-참고

https://proudin.tistory.com/28

 

+ Recent posts