[Mongodb] Mongodb 사용법 ( 쿼리문, 테이블 생성, 조회, INSERT 등 )
1. Database ( RDBMS에서 Database )
말 그대로 Database. 한 포트에도 여러 Database가 존재하며 스위칭 해가며 사용 가능.
database 생성
use test
---
결과
switched to db test
현재 사용중인 database 조회 ( 최소 1개 이상의 Collection이 있어야 조회 됨 )
show dbs
---
결과
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
현재 사용중인 database 이름 확인
현재 사용중인 database 삭제
db.dropDatabase()
---
결과
{
"dropped" : "test",
"ok" : 1.0
}
2. Collections ( RDBMS에서 Table )
RDBMS에서 Table에 해당하는 Collections
Collection 생성
db.createCollection(name, [options]) 형태로 사용 가능. ( options은 생략 가능 )
db.createCollection("test")
---
결과
{
"ok" : 1.0
}
Collection 조회
show collections
---
결과
test
Collection 제거
db.{COLLECTION_NAME}.drop() 형태로 사용 가능
db.test.drop()
---
결과
true
3. Documents ( RDBMS에서 ROW )
RDBMS에서 ROW에 해당하는 Document
Document 추가
db.{COLLECTION_NAME}.insert([{document},{document}, …]) 형태로 사용 가능.
db.test.insert([{"name":"kim","age":20},{"name":"kim","age":21}])
---
컬렉션 조회 결과
{
"name" : "kim",
"age" : 20.0
},
{
"name" : "kim",
"age" : 21.0
}
Document 제거
db.{COLLECTION_NAME}.remove({query},{justOne}) 형태로 사용 가능.
파라미터 | 타입 | 기본값 | 설명 |
---|
justOne | boolean | false | true 일 경우 딱 하나만 지움. |
db.test.remove({"name":"kim"},true)
---
컬렉션 조회 결과
{
"name" : "kim",
"age" : 20.0
}
[Mongodb] Mongodb 설치 및 실행 Window
Mongodb 설치
1. Mongodb 홈페이지 접속 후 다운로드
다운로드 페이지
공식 홈페이지 : https://www.mongodb.com/try/download/community
원하는 버전 선택 후 msi 파일로 다운로드
2. 설치파일 실행
경로를 커스텀 하지 않았다면 C:\Program Files\MongoDB 경로에 설치가 됨.
(선택) 3. 환경변수 설정
선택사항. 매번 몽고DB 설치 경로(C:\Program Files\MongoDB)로 이동해서 명령어를 날려도 상관 없으면
스킵해도 상관 없음.
어느 경로에서나 몽고DB를 실행하고 싶다면 필요.
내 컴퓨터 -> 속성 -> 고급 시스템 설정 -> 환경 변수
Path 변수에 C:\Program Files\MongoDB\Server\ {버전} \bin 추가
4.명령 프롬프트(CMD) 창에서 Mongodb 실행 및 data/db 디렉토리 생성
실행 -> CMD
3의 환경변수 설정을 했다면 어떤 경로에서나 실행 가능
변수 설정 안했다면 mongodb 설치 경로로 가서 실행 가능
서버 실행
서버 접속
별 다른 작업 없이 mongod 명령어로 서버 실행 할 경우 아마 Exception이 발생 할 것이다.
내용은 Data 경로가 없다는 내용. 쉘에서 mkdir Data/db/ 생성해주든, 해당 경로가서 마우스 우클릭으로 새 폴더 생성해주던 상관 없음.
5.확인 (웹브라우저)
웹브라우저에서 http://localhost:27017 접속
It looks like you are trying to access MongoDB over HTTP on the native driver port.
위와 같은 문구가 나온다면 정상.
Mongodb의 기본 포트는 27017
다음 포스팅에선 mongodb의 기본 명령어.
Apcahe + Tomcat + Java + Scouter 사용 중.
오픈소스 모니터링 APM 툴로 사용중인 Scouter.
도입 후 너무 요청은 나오지 않아 불편함이 있었는데
최근 도입된 시스템을 보니 모든 요청이 다 표시되서 확인해보니 시스템마다 XLog에 표시 할 최소 응답 시간을 설정해줄 수 있었다. ( 모든 시스템이 일괄로 적용해야 하는줄 알았는데 개별 적용이 가능! )
방법
해당 시스템 우클릭 후 Configure에 들어가서
xlog_lower_bound_time_ms 설정값을 바꿔주면 끝.
설정값 자체를 삭제하면 모든 요청을 보여주고
100을 설정하면 0.1초 이상 걸린 요청 건들만 보여준다.
결제 시스템이 변경되어 열심히 개발하는 중.
수수료가 1원씩 차이가 나는 경우가 발생했다.
회사마다 다르겠지만. 0.3원을 청구할 순 없으니 소수점 이하는 버리도록 개발을 하였다.
문제는 이 버리는 로직에서 발생하였다.
카드사와 수수료가 1원씩 차이는 데이터가 발생하였다고 확인해 보니
카드사에서는 3,772원의 수수료가. 우리에게는 3,771원으로 등록되어있어 발생한 것을 확인.
해당 주문은 82,000원에 수수료 4.6%로 계산기를 두드려보니 3,772원이 맞았다.
무엇이 문제인지 확인해 보니 전임자가 수수료 계산을 double 자료형으로 해놨었다.
구글링을 해보니
Java Double value = 0.01 changes to 0.009999999999999787 라는 StackOverflow 글을 발견.
- 소수점 정밀도에 있어 문제가 있는 double로 소수점을 계산하다 보니 0.000000006원 정도의 차이가 발생했고 소수점을 절삭하는 바람에 1원이 누락된 것.*
해결책
1.BigDecimal 사용
정확한 숫자 계산을 위해서는 BigDecimal을 사용해야 한다는 깨달음을 다시 얻고 문제 해결.
배포 시스템 중 jar로 묶어서 서비스 하는 시스템이 있다.
보통 젠킨스에서 자동으로 빌드해주는 jar를 사용하지만. class 파일만 따로 수정해야 하는 경우가 있다.
보통 개발자가 class 파일을 메신저를 통해 주면 서버에 올려서..
서버에 있는 jar를 풀어서 다시 묶거나, 명령어를 통해 수정하기 마련인데
“제대로 반영이 안된 것 같아요..ㅠㅠ 확인가능할까요?” 이런 요구도 자주 있고 서버 내에 파일을 올려서 하다보니 지우는걸 까먹으면 쓸모없는 파일들이 운영 서버에 올라가서 방치되는 경우도 많다.
그래서 왠만하면 메신저로 파일 받아서 윈도우 환경에서 하는걸 선호하는 편.
윈도우에서 명령어 치기도 귀찮고. 여러모로 여기나 저기나 불편했는데 좋은 툴을 발견.
7zip
https://www.7-zip.org/
위 홈페이지에서 받을 수 있다.
jar파일을 우클릭하니 jar파일도 바로 열 수 있도록 지원을 해서 해봤는데..
jar 파일 안에 있는 파일들의 추가/삭제/변경 모두 굳이 압축을 해제하지 않고 바로 할 수 있다.
번거롭게 서버에 올려놓고 명령어를 치지 않아도 되고.
굳이 압축해제,다시 묶는 작업 안해도 되고
수정한 날짜 등등도 한눈에 보기 편하게 나온다
입사전에는 윈도우밖에 모르는 코알못이였고, 검은화면에서 CLI로 일하는 사람을 보면 너무 신기했다.
뭔가 엄청난 속도로 타이핑을 하면 검은 화면이 휘리릭 휘리릭 바뀌는게 너무 신기했는데.
이제서 생각해보니 그저 ls 였을 뿐이였다…
배포담당자로 일하다 보니 나도 GUI보다 CLI가 편하고 익숙해지고있다. ( 처음엔 어떻게 저 조잡한 화면이 윈도우보다 편할 수 있다는거지 생각했었는데! )
굳이 마우스까지 가지 않아도 되는 CLI의 편리함을 모두가 알았으면 해서.. 그리고 언제 삭제될 지 모르는 포스트잇에 보관되어있는 자주 쓰는 명령어들을 정리해보려고 한다.
1. cd ( Change Directory )
경로를 변경하는 명령어. 따로 설명할게 없다.
cd / ( 최상위 디렉토리 ) cd .. ( 이전 디렉토리 ) cd ~ ( home 디렉토리 )
2. pwd ( Print Working Directory )
현재 위치를 알려주는 명령어. 역시나 설명할게 없다.
3. ls ( List )
파일의 목록을 알려주는 명령어.
가장 많이 쓰는 형태는 역시 상세+전체보기 옵션인 ls -al
ls -al 을 alias 로 ll로 등록해놓고 쓰면 훨씬 빠르게 쓸 수 있다
4. df ( Disk Free )
디스크들의 남은 용량들을 표시해주는 명령어.
가장 많이 쓰는 형태는
df -h
// h옵션은 --human-readable 옵션으로 메가,기가바이트 등 사람이 읽기 편한 단위로 표시해준다.
df -m
// 메가바이트 표시 로 자주 쓰고 있다.
5. du ( Disk Usage )
디렉토리들의 디크스 사용량을 표시해주는 명령어.
가장 많이 쓰는 형태는
du -sh *
// -h 읽기 편하게, -s 용량 합, *까지 하면 현재 경로의 하위디렉토리들의 디스크 사용량을 표시. )
du -h --max-depth=1
// -h 읽기 편하게, --max-depth=(숫자) 현재 경로의 몇단계 하위 디렉토리들의 용량 합이다.
// 1을 넣으면 위의 du -sh *과 동일하다고 보면 된다.
매일 똑같은 개발만 하다보니 지겹기도 하고
어느정도 개인적인 스킬업도 필요하다고 생각해서 해커랭크를 다시 시작했다.
분명히 예전에 가입했던 계정이 있었는데.. 까먹어서
그냥 새로 만들어서 시작!
이번엔 진짜 차근차근 하나하나 다 풀어볼 계획이므로
Problem Solving부터 시작.
Solve Me First
Compare the Triplets
A Very Big Sum
Diagonal Difference
풀이 완료.
(Diagonal Difference 푸는데 절대값을 안붙여서 3번이나 틀렸다.)
첫 번째 별을 땄다.
과거에는 자동배포 환경이 구축되어있었으나.
서버 IP 변경 등으로 인해 자동배포가 되지 않고 있던 시스템을 다시 배포환경 구축하는 업무를 맡았다.
로컬에서 빌드하고.. 서버에 파일 교체하는 형식으로 오랫동안 배포를 해서
형상관리 툴에 있는 소스는.. 에러 투성이 ㅠㅠ
pom.xml에 라이브러리들 추가해주고 이것저것 손봐서 대강 에러를 잡아놓고
Jenkins를 통해 빌드를 하였다.
하지만 떡하니 발생한 BUILD FAILURE
Server returned HTTP response code: 501
Server returned HTTP response code: 501
한번 겪어봤었기에 능숙하게 메이븐 repository 주소 바꿔주고.
jenkins 에 메이븐 빌드 옵션 추가해주고 다시 빌드하였으나
( 기존에는 spring-framework-bom 이라는 라이브러리에서 발생하였다. 스크린샷은 이후 발생한 비슷지만 다른 이슈 )
해당 라이브러리는 dependency로 추가해준 적도 없고.
insecure 로 repoistory를 바꿔도. https로 바꿔도 똑같이 http://repo1.maven 을 호출하여 빌드 실패..
해결
아무리 구글링 해도 나오지 않아서.. 사수와 의논한 결과
maven 로컬 레포지토리에 라이브러리를 직접 넣어보기로 하였다.
( 로컬 서버에도 로컬 레포지토리가 있듯, jenkins 서버에도 maven-local-repo 라는 폴더로 로컬 레포지토리가 있었다. )
직접 jar 파일 다운로드 하여, 해당 경로에 버전 맞춰서 jar 파일 넣고 빌드하니 BUILD SUCCESS
로컬에 있을 경우 굳이 maven 서버나 nexus 서버에 통신하지 않기 때문에 되는 것으로 추측 중이다.
내가 만든 어플리케이션은 PWA를 도입한 후 네이티브 웹뷰를 씌웠었다.
PWA의 도입으로 유저들이 조금은 편해질 줄 알았는데 거의 활용하는 모습을 보지 못했고..
유저들이 친숙한 네이티브 앱 형태로 만들기 위해 웹뷰를 띄우고 푸쉬와 SMS 등등 몇가지 네이티브 기능만 도입하였다.
그러던 중 간헐적으로 뒤로가기 시 net:ERR_FAILED 오류가 발생하여 화면이 뜨지 않는다는 문의가 들어왔다.
확인해보니 service Worker에서 fetch를 하는 도중 오류가 나는 것으로 파악하였다.
네이티브 앱에선 Service Worker를 사용하지 않도록 하자
구글링을 열심히 해보니 이미 알려진 크롬 이슈인 듯 하다.
https://github.com/react-native-community/react-native-webview/issues/671
https://bugs.chromium.org/p/chromium/issues/detail?id=977784
해결책은 웹뷰일 경우 서비스워커를 등록 해제하는 코드가 나와있었다.
navigator.serviceWorker.getRegistrations().then(function(registrations) {
for (let registration of registrations) {
registration.unregister();
}
});
해당 코드를 커밋 후 테스트 해본 결과 로컬과 개발서버에선 정상적으로 작동하는데.
이상하게 운영 환경에선 여전히 똑같은 에러가 발생..
결국 서비스 워커의 fetch 기능을 삭제해버렸다.
PWA를 도입하였으나 안드로이드 사용자들은 대부분 네이티브 앱을 설치하여 사용하고.
ios에선 웹을 통한 사용을 권장해왔으니.
과감하게 service Worker의 fetch 기능을 삭제해버렸다.
serviceWorker.js 의 fetch 관련된 소스를 전부 주석처리.
추후 시간이 나면 해결책을 조금 더 찾아봐야겠다.
[Oracle/iBatis/Java] SelectKey Insert 후에 Key 값 바로 가져오기
SelectKey
개발을 하다보면
INSERT => 특정 로직 수행 => UPDATE
이런 형태로 구현을 해야 할 때가 있다.
나의 경우 PUSH 서버를 구축하는데 필요했는데.
DB에 발송 정보를 먼저 INSERT 하고 (INSERT)
FireBase를 호출하여 PUSH를 발송하고 (특정 로직 수행)
해당 결과 값을 받아서 위에서 INSERT 한 데이터에 메시지 ID나 멀티캐스트 ID를 업데이트 해주고자 하였다. (UPDATE)
물론 해당 로직을 하기 위해서 java에서
SELECT 하여 KEY 값을 조회 후 값을 담기
=> 해당 KEY로 INSERT 수행
=> 로직 수행
=> 담아놨던 KEY로 UPDATE 수행
할 수도 있겠지만 코드는 쉽고 짧을 수록 좋은 법.
iBatis의 selectKey를 통해 Insert 하면서 동시에 key값을 받아오는 방법으로 처리 할 수 있다.
<insert id="insertUser" parameterClass="java.util.Map">
<selectKey keyProperty="userCd" resultClass="Integer">
SELECT SEQ_TEST.NEXTVAL FROM DUAL
</selectKey>
INSERT INTO USER(
USER_CD,
NAME
)
VALUES (
#userCd#,
'테스트',
)
</insert>
위와 같이 XML 작성 하면
iBatis 에서 return 값으로 selectKey의 resultClass Object를 반환한다.
Pagination