고객사에서 MariaDB를 설치하고 있다. 그러던 와중, 잘 구동되던 Tomcat을 재구동하게 되었는데 오류메시지 "Access denied for user '계정명'@'localhost'(using password:YES)" 라는 오류가 발생한다. 이전까지는 재구동하는데 문제가 없었고, 오류가 생길만한 작업은 약 서너가지 정도가 짚히는 상황이었다. 현재 WAS 설정으로는, server.xml 및 context.xml 내에서 JNDI를 해당 MariaDB로 설정해둔 상태였다.


먼저, MariaDB에 익숙하지 않은 나인지라 용어의 혼란이 조금 있을 것 같아 아래와 같은 내용으로 이해를 하고 있다.  MariaDB는 계정별로 두 개의 권한을 갖는 듯한 모습이었다. MariaDB의 계정 테이블을 쿼리해보면 Host라고 작성된 부분이 있는데, 여기에 localhost 및 % 정도로 권한(?)이 부여가 된다. localhost는 내부에서만 접속이 가능하고, %은 내/외부에서 접속이 모두 가능한 권한 정도로 이해하고 있다.


1. 원인파악

본론으로 돌아와서 검색해보니 뭐 당연하게도 해당 계정의 localhost 권한이 없다는 문구다. 그래서 MariaDB가 설치된 서버에 접속하여 아래의 명령어를 사용했다. 해당 명령어는 shell 에서 MariaDB에 접속하기 위한 명령어이다.


1
mysql -u 계정명 -p
cs

그런데 위의 tomcat과 마찬가지로 "Access denied for user '계정명'@'localhost'(using password:YES)" 오류가 발생한다. 그래서 MariaDB의 root계정으로 접속하려는데, root 권한 또한 마찬가지 오류가 발생한다. 


이래저래 구글링을 해보니, 다음과 같은 명령어를 찾게 되었다.

1
sudo /usr/bin/mysqladmin -u root password [비밀번호]
cs

해당 명령어는 서버의 root 권한으로 서버 내에 설치된 MariaDB의 root 비밀번호를 재설정하는 것이다. 이 이후에, mysql -u root -p 명령어로 접속하였고, localhost 계정을 다시 생성해주려 하였다.


1
MariaDB[(none)]> CREATE USER '계정명'@'localhost' IDENTIFIED BY '비밀번호';
cs

했더니, 아래와 같은 오류메시지가 출력된다.


1
ERROR 1396(HY000) : Operation CREATE USER failed for '계정명'@'localhost';
cs

뭔가 해서 봤더니 직접 생성이 불가능한 것 같다. 혹시나 싶어, 계정 테이블을 직접 쿼리해서 상태를 좀 보고자 했다.


1
2
MariaDB[(none)] > use sql; --Database를 변경하는 명령어
MariaDB[(mysql)] > SELECT * FROM user WHERE user='계정명';
cs

해당 명령어로 조회해보니 우리 DB에서 사용중인 계정 - Host(권한이라고 이해중)별 비밀번호가 각각 다른것이었다. A 계정의 % Host(권한)과 A 계정의 localhost Host(권한)과 비밀번호가 각기 다른 상황. 이러니 서버나 tomcat에서 접속할 때에는 Access Denied For User 에러가 발생했을 것이고, 개발자 PC의 DB툴로는 접속이 잘 되었겠지. 이제 원인이 파악된 상황이다.


1
2
3
4
5
6
7
8
9
10
+-------------------------------------------------------------------------------+
| Host      | User        | Password              | Select_priv  | Insert_priv  |
+-------------------------------------------------------------------------------+
| localhost | mariadb.sys |                       | N            | N            |
| localhost | root        | *E1C459C5 ~~~~~~~~~   | Y            | Y            |
| localhost | mysql       | invalid               | Y            | Y            |
| localhost |             |                       | N            | N            |
| %         | test        | *0B26A ~~~~~~~~~~~~~~~| N            | N            | 
| localhost | test        | *COB5F ~~~~~~~~~~~~~~~| N            | N            | 
+-------------------------------------------------------------------------------+

cs

* test라는 계정의 % Host 비밀번호는 암호화되어 *0B26A로 시작하는데, localhost는 *COB5F로 시작한다. 이러니 외부에서 접속하는 % Host는 기존 비밀번호로 접속이 되고, 같은 서버 내에 있는 tomcat은 기존 비밀번호로 접속이 안되겠지.



2. 문제해결


일단 원인은 알았다. test 계정의 % 비밀번호와 test 계정의 localhost 비밀번호가 다르기에 생긴 문제라는 것. 일단 localhost 비밀번호가 왜 저렇게 변경되었는지는 작업자들에게 물어보면 될 것이고, 접속이 되도록 수정을 해야겠다. 이럴땐 뭐다? test 계정의 localhost Host(권한)비밀번호를 기존에 사용중인 비밀번호로 Update 쳐주면 될 것이다.


1
MariaDB[(mysql)] > UPDATE user SET password=('비밀번호') WHERE user='계정명';
cs

했더니, 다음과 같은 에러가 발생한다.


1
ERROR 1348(HY000) : Column 'Password' is not updatable.
cs

않이; 뭐냐 대체 이건. 또다시 검색해보니 MariaDB 10.4 버전 이상은 user테이블을 직접관리하지 않고, 파일이나 뭐 그런식으로 관리하기 때문에 기존의 user테이블 update 방식은 사용할 수 없다고 한다. 그래서 또다시 뒤져보니 명령어로 직접세팅하는 방법이 있었다.


1
MariaDB[(mysql)] > set password for '계정명'@'localhost=password('비밀번호');
cs

했더니, Query OK, 0 rows affected (0.014sec) 메시지가 출력되었다. 그리고 다시 user 테이블을 확인해보았고, 해당 계정의 % Host와 localhost Host의 비밀번호가 동일한 것을 확인할 수 있었다.


1
2
3
4
5
6
7
8
9
10
+-------------------------------------------------------------------------------+
| Host      | User        | Password              | Select_priv  | Insert_priv  |
+-------------------------------------------------------------------------------+
| localhost | mariadb.sys |                       | N            | N            |
| localhost | root        | *E1C459C5 ~~~~~~~~~   | Y            | Y            |
| localhost | mysql       | invalid               | Y            | Y            |
| localhost |             |                       | N            | N            |
| %         | test        | *0B26A ~~~~~~~~~~~~~~~| N            | N            | 
| localhost | test        | *0B26A ~~~~~~~~~~~~~~~| N            | N            | 
+-------------------------------------------------------------------------------+

cs

이후, tomcat을 재구동하였더니 정상동작 하였다.



3. 후기


MariaDB를 직접적으로 설정하고 사용할 일이 없어 여러모로 삽질을 많이하게 되었다. 문제해결하면서 알게된 점을 아래에 간략하게 작성해보았다.

계정은 Host(권한)별로 password가 지정된다는 점이다. 위에서도 보여지듯, test 계정임에도 불구하고 로컬(같은 서버내)에서 접속가능한 비밀번호와 외부에서 접속 가능한 비밀번호가 각기 설정되어있다.


또한, 명령어의 password('비밀번호')는 자동으로(?) 인코딩되어 설정된다는 점이었다. 혹시나 싶어 구글링한 결과 그대로 작성해보았는데, 알아서 인코딩되어 저장되는 것을 보니 어딘가에 설정이 박혀있는게 아닐까 싶다. 뭐 복잡시럽게 sha256으로 인코딩해서 직접 박아넣는게 아니라 다행이다 싶다.


위의 상황이 발생하게 된 계기는, 하나의 서버를 여러부서가 공동으로 개발장비로 사용하는 중이었고, MariaDB를 우리팀에서 설치, 사용을 하고 있었다. 그러다가 타 부서에서 MariaDB를 사용 할 일이 생기게 되었고, 우리가 설치한 MariaDB에 접속이 안되니 멋대로 서버의 root 권한으로 test계정의 localhost 비밀번호를 바꿔버려 생긴 문제였다. 거기에, 우리팀 막내가 당일 MariaDB 설정과 관련하여 파일 권한이라거나 기타 설정들을 바꾸면서 MariaDB Service를 재구동하는 등 여러 변경점이 생기다보니 우리팀 내에서만 원인 찾기가 힘든 상황.


나의 경우에는 계정-host별 비밀번호가 다르게 적용되는 줄 몰랐던터라, 애꿎은 DB보안프로그램과 서버접속 보안프로그램 탓을 했었다. tomcat 재구동 작업을 하기 바로 전날 야간에 설치가 되었던터라, 이 부분이 문제인줄 알았던 것. 여러 작업적인 이슈가 겹치다보니 생긴 당연한 인재였다. 개발서버였기에 망정이지, 실 운영이 진행중인 운영서버였다면 초대형사고였을지도 모른다. 이러한 이유로, 무슨 작업이든 작업이 있을 경우에는 연관부서에 모두 noti를 해줘야한다는 것이다.

블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요

프로젝트를 하다가 p12 key로 SSL 적용할 일이 생겼다. 지금까지는 pem 키라거나 뭐 그런거로 했었는데. 여튼 오랜만에 적용해보니 살짝 헤매서 정리해놓는다.


p12든 뭐든 사실 크게 다른 건 없다. 단지 $catalina_home/conf/server.xml이 조금 달라질 뿐.


1
2
3
4
<Connector port="8081" protocol="org.apache.coyote.http11.Http11NioProtocol"
  maxthreads="150" SSLEnabled="true" scheme="https" secure="true"
  clientauth="false" sslProtocol="TLS" keystoreType="pkcs12" 
  keystorePass="비밀번호" keystoreFile="/home/keystore/keystore.p12"/>
cs


별다른 건 없다. 위와 같이 적용해주면 된다.

기존의 Connector는 주석으로 너굴맨이 처리했으니 걱정말라구!


주의할 점은 keystoreType이 대소문자를 구분하는건지, PKCS12로 썻다가 안먹혀서 좀 당황했다.

'어장 Develop' 카테고리의 다른 글

[tomcat] p12 ssl 적용  (0) 2020.06.08
[Linux] Centos Alias 설정  (0) 2020.04.11
[Linux] make: g++: Command not found  (0) 2019.08.12
[JavaScript] timestamp convert to date type  (1) 2019.03.15
[Intellij] 인텔리제이 - lombok 설치  (0) 2018.09.06
ibatis selectkey 사용  (0) 2018.05.10
블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요

RESTful API를 개발하다가 좀 멘붕에 오는 상황을 발견했다. postman으로 아무리 날려도 파라미터는 계속 false만 찍는 것이었다. 대략적으로 다음과 같았다.


1
2
3
4
private boolean isBusiness;     // 개인용 false / 법인용 true
private String userName;        // 개인용 - 사용자명 / 법인용 - 법인명
private String userSex;         // 개인용만 사용, 성별
private String userInfo;        // 개인용 - 사용자 태그 / 법인용 - 법인 태그
cs


로그는 다음과 같다.

2020-05-13 18:30:47.801  INFO 17740 --- [nio-9988-exec-1] o.s.web.servlet.DispatcherServlet        : Completed initialization in 5 ms

[사용자정보] UserIssueVO: UserIssueVO(isBusiness=false, userName=TEST, userSex=M, userInfo=TEST_tag)


파라미터를 바꾸면 잘되고 해서 대체 뭐가 잘못인가. 대충 30분 정도 고민하다가 개발자들의 꿈과 희망, 스택오버플로우에서 검색하니 다음과 같은 링크가 뜬다.


JSON Post request for boolean field sends false by default

https://stackoverflow.com/questions/21913955/json-post-request-for-boolean-field-sends-false-by-default


그래서 찾아보니, lombok과 같은 어플리케이션으로 getter/setter를 생성할 때에는 boolean 필드이름에 'is'를 쓰지 않는 것이 맞다고 한다. jackson의 java bean 네이밍 규칙이라고.

어쩐지 이후 로직을 짤 때 세팅하는 쪽에서 isBusiness로만 찍히기에 조금 의아하긴 했다.


여튼 한가지 알아둘 점은 lombok 사용시 boolean 필드명은 is를 쓰지 않는다는 것. 이거 하나면 됐다.

블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요

alias를 설정하면 긴 명령어(수많은 디렉토리들..)를 단축하여 편하게 작업할 수 있다.

나만이 쓰는 서버라면 무엇을 정해도 상관없지만, 공용개발서버라면 개발자들간의 이해와 협의가 필요할듯.


현재 적용된 alias는 alias 라는 명령어로 확인 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@localhost go]# alias
alias cdcc='cd /home/host/test/chaincode/test-cc/go'
alias cdh='cd /home/host'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
cs


현재 적용된 alias들

수정 명령어는 vi ~/.bashrc로 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[root@localhost go]# vi ~/.bashrc
 
# .bashrc
 
# User specific aliases and functions
 
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias cdh='cd /home/host'
alias cdcc='cd /home/host/test/chaincode/test-cc/go'
 
# Source global definitions
if [ -/etc/bashrc ]; then
        . /etc/bashrc
fi
 
cs

alias를 적용하고, 저장 후 종료한 다음에는 꼭 source ~/.bashrc를 해줘야 현재 쉘에서 바로 사용이 가능하다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost go]# source ~/.bashrc
[root@localhost go]# alias
alias cdcc='cd /home/host/test/chaincode/test-cc/go'
alias cdh='cd /home/host'
alias cp='cp -i'
alias egrep='egrep --color=auto'
alias fgrep='fgrep --color=auto'
alias grep='grep --color=auto'
alias l.='ls -d .* --color=auto'
alias ll='ls -l --color=auto'
alias ls='ls --color=auto'
alias mv='mv -i'
alias rm='rm -i'
alias which='alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'
cs


굳ㅋ

'어장 Develop' 카테고리의 다른 글

[tomcat] p12 ssl 적용  (0) 2020.06.08
[Linux] Centos Alias 설정  (0) 2020.04.11
[Linux] make: g++: Command not found  (0) 2019.08.12
[JavaScript] timestamp convert to date type  (1) 2019.03.15
[Intellij] 인텔리제이 - lombok 설치  (0) 2018.09.06
ibatis selectkey 사용  (0) 2018.05.10
블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요

별건 아니지만 왠지 정리해야 할 것 같은 느낌이다.

UUID는 Universally Unique IDentifier의 약자로, 범용 고유 식별자라는 뜻을 갖고 있다. 유니크한 ID를 만들거나 뭐 활용도가 무궁무진하다. 사용법은 JAVA에서 그냥 import 후 사용하면 된다.


1
2
3
4
5
6
7
8
9
10
public static String uuid() throws Exception {
    try {
        String uuid = UUID.randomUUID().toString();
        System.out.println(uuid);        
        return uuid;
    } catch (Exception e) {
        // TODO: handle exception
    }
    return null;
}
cs


대충 요런식. 그러면 뭐 유니크한 ID가 나오게 된다.

별거 없다.

블로그 이미지

김생선

세상의 모든것을 어장관리

Tag java, UUID

댓글을 달아 주세요

오랜만에 아두이노를 만지고 있다. 만들고 싶은 물건이 있어서. 그러다보니 환경설정부터 해서, 모두 다 새로 하고 있는데 오래간만에 하니 요상시런 에러가 뜬다.

참조로 지금 사용하는 환경은 아두이노 나노에, 정품이 아닌 호환보드를 쓰고 있다. 처음에 개발할 때에도 뭔가 이것저것 설정값을 만지다가 겨우 성공했는데 어떻게 했는지 까먹어서, 이번엔 제대로 적어두고자 한다.



avrdude: stk500_getsync() attempt 1 of 10: not in sync: resp=0x00


뭐 대충 이런 에러인데, 뭐 인터넷에서 대충 검색해보면 아두이노 포트라거나 드라이버를 제대로 설치하라고 한다. 거기에 DI포트라거나 뭐 이런 말들이 많은데, 사실 가장 먼저 확인할 일은 다음과 같다.


1. 드라이버 설치

드라이버 설치와 같은 경우에는 현재 사용중인 운영체제(Windows/MacOS) 등에서 아두이노 개발을 하기 위해 필수적인 과정이며, 아두이노에서 사용하는 프로세서의 드라이버가 필요하다. 호환 아두이노 나노는 CH340 프로세서를 사용하며, 이는 정품 아두이노 나노와는 다르게 드라이버를 직접 설치해줘야 한다.


2. 아두이노 포트 확인

아두이노 포트는 Windows10 기준, 장치관리자에서 다음과 같이 확인이 가능하다.


장치관리자의 포트(COM & LPT) 항목에서 USB-SERIAL CH340 (COM3)가 바로 현재 USB로 연결중인 아두이노 나노의 모델명과 포트이다.

포트는 COM3 포트로 연결되어있는 것을 확인할 수 있다. 여기까지 되었으면 3번으로 가자.


3. 현재 아두이노 IDE 환경의 보드와 프로세서 선택



먼저 툴 - 보드 항목에서 정상적으로 아두이노 나노로 선택되어있는지 확인하자. 물론, 포트 항목에서 장치관리자에서 확인한 것과 같은 포트로 선택되어있는지도 확인해야 한다.

나의 경우에는 아두이노 우노로 선택되어있었기에 문제가 생겼던 편이었다.




아두이노 나노로 선택하고나서는 프로세서를 선택하자. 호환 아두이노 나노의 경우에는 프로세스가 ATmega328P(Old Bootloader)로 선택되어야 정상적으로 동작한다.




블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요

이클립스에서 dll 라이브러리를 활용하여 빌드를 할 일이 있었다.

비단 이클립스 뿐만 아니라 인텔리제이도 마찬가지였고. dll 라이브러리를 추가하는 방법을 몰라 헤맸는데, 간단히 해결할 수 있었다.


관련 dll 파일들을 모두 C:\Windows\System32 디렉토리에 넣어주면 된다. 

일각에서는 dll 파일들의 path를 잡아주면 된다고는 하는데 방법을 잘 몰라서 이렇게 무식한 방법으로 해결함...

블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요

make: g++: Command not found

 

npm install을 할 때, 위와 같은 에러가 발생하곤 한다. g++ 인스톨이 필요하다.

해결방법은 yum -y install gcc-g++ 로 설치. root 권한이 필요할 수 있다.

'어장 Develop' 카테고리의 다른 글

[tomcat] p12 ssl 적용  (0) 2020.06.08
[Linux] Centos Alias 설정  (0) 2020.04.11
[Linux] make: g++: Command not found  (0) 2019.08.12
[JavaScript] timestamp convert to date type  (1) 2019.03.15
[Intellij] 인텔리제이 - lombok 설치  (0) 2018.09.06
ibatis selectkey 사용  (0) 2018.05.10
블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요

개발하다보면, 특정 컬럼의 네이밍을 조회하는 경우가 있다. 가령 A 라는 컬럼을 어떤 테이블에서 더 쓰는지. 뭐 이런 경우. Oracle은 all_tab_column인지 all_object를 쓰면 되긴 하는데 mysql은 처음이다. 하지만 간단하다.


1
SELECT * FROM information_schema.columns
cs



이렇게 해주면 된다. 개꿀.

블로그 이미지

김생선

세상의 모든것을 어장관리

Tag mysql

댓글을 달아 주세요

개발하다보면 해당 페이지의 table의 데이터들을 새로고침 없이 데이터를 붙여쓰는 경우들이 있다. 이는 대부분 리스트로 구성된 페이지에서 확인이 가능한데, 가령 오픈마켓의 주문배송리스트라거나, 뭐 카드사용 내역과 같은 페이지에서 주를 이룬다.

div태그를 쓰던 table태그를 쓰던 아마 과정은 비슷할 것이고, javascript에서 데이터와 html태그들을 어떻게 만들어서 jsp에 붙여주는지에 대한 예제를 작성해보고자 한다.


먼저 JSP에서는 다음과 같이 구성한다. 기본적으로 페이지가 로딩될 때, controller 단에서 modelAndView에서 데이터를 호출, List로 이루어진 객체들을 foreach 로 계속 붙여주는 구조로 되어있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<!--결과 리스트-->
<div class="result-area">
  <h2 class="result-tit">거래결과 리스트</h2>
  <ul class="result-list" id="resultList">
      <c:forEach var="resultHistory" items="${resultHistory}" >
      <li class="result-item">
          <p class="result-day">${resultHistory.REG_DATE} <span>${resultHistory.ORDER_TYPE}</span></p>
          <dl class="result-detail">
              <dt>품명</dt>
              <dd>${resultHistory.PRODUCT_TYPE}</dd>
              <dt>금액</dt>
              <dd>${resultHistory.AMOUNT}</dd>
          </dl>
      </li>
      </c:forEach>
  </ul>
</div>
<div class="more-btn-wrap">
  <button type="button" id="btnResultMore">더보기</button>
</div>
cs


modelAndView 에서는 resultHistory라는 네이밍의 List 객체에 데이터들을 담아준다. 그리고 해당 jsp페이지가 호출되면, foreach로 객체들을 돌리면서(?) 각 항목들을 구성하게 된다. 이 때, btnResultMore를 클릭한다고 하자. 그럴 때 해당 페이지를 새로고침 없이, 리스트의 하단에 추가적으로 데이터가 붙는 방식이면 훨씬 보기가 좋을 것이다. 새로고침을 하게 되면 현재 입력되어있는 값들도 저장하지 않는 이상 사라질 것이고, 무엇보다 좀 더 자연스러운 화면을 뿌려줄 수 있을 것이다.


btnResultMore 버튼에 매핑되어있는 javaScript의 펑션을 보자.


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
var pageNo = 0;
 
//결과 더보기
$("#btnResultMore").on("click"function () {
  $.ajax({
    type:'GET',
    url : '/resultMore.json',
    global : false,
    async : true,
    data : {
      pageNo: pageNo
    },
    success : function(json) {
      $('#resultList').empty();
 
      var html = '';
      pageNo = pageNo+1;
      json.resultList.forEach(function(item, index){
        html = $('<li class="result-item">' +
          '<p class="result-day">'+item.REG_DATE+' <span>'+item.ORDER_TYPE+'</span></p>' +
          '<dl class="result-detail">' +
          '<dt>품명</dt>' +
          '<dd>'+item.PRODUCT_TYPE+'</dd>' +
          '<dt>금액</dt>' +
          '<dd>'+item.AMOUNT+'</dd>');
        $('#resultList').append(html);
      });
    },error:function(json){
 
    }
  });
});
cs


자바스크립트에서는 ajax 호출을 통해, 데이터를 더 가져오기 위한 controller 와 매핑을 시켰다.

정상적으로 쿼리가 이루어지는 경우에는 success flag를 탈 것이고, 이 때부터 로직이 시작된다.


기본적으로 들어있는 row를 날리기 위해, 14번 라인에서는 resultList의 자식들을 모두 비워준다.

그리고 18번 라인에서 가져온 데이터를 기반으로 forEach를 돌리면서, HTML tag를 새로 만들어주는 방식으로 이루어져있다.

위의 jsp와 마찬가지로 같은 구성으로 html과 데이터를 매핑해준 후에, 26번 라인에서 append를 시켜주면 끝.


추가적으로 btnResultMore를 누르게 되면 5개씩 항목을 더 붙여주는 기능을 포함한 것인데, pageNo 변수를 추가하여 이를 쿼리에 응용했다.

기본값은 0으로 처리가 되어서 쿼리에서는 기본 5개, 1일 경우에는 10개를 가져오는 방향으로.


javascript 에서 append와 appendTo의 쓰임새가 확연히 다르다.

$('#a').append(b); 의 경우에는 a에 b를 넣는 것이고, $('#a').appendTo(b);는 b를 a에 넣는것이다.

블로그 이미지

김생선

세상의 모든것을 어장관리

댓글을 달아 주세요