<서론>

자바로 개발 중, ConcurrentModificationException이 발생했다. set을 사용할 때 나온 exception인데, 거의 처음 만난 exception이라 당황했다. 대충 찾아보니 동시성 문제라고 한다. set을 iterator에서 불러서 iterator.hasNext()를 while문 조건으로 넣어놓고 set을 수정했더니 이런 문제가 발생했다.


 

 

<본론>

set을 하나 복사해서 하면 될거라고 생각했다. 하지만 set이 깊은 복사가 되어서 복사한 set을 수정해도 원본의 set이 수정되었다. 결국 깊은 복사가 아닌 얕은 복사로 해당 문제를 해결하였다.

아래는 이해를 돕기 위한 코드이다.

 

1) 깊은 복사인 경우. (이때는 ConcurrentModificationException이 발생)

1
2
3
4
5
6
Set<Integer> tmpSet = set;
tmpSet.addAll(set);
Iterator<Integer> it = tmpSet.iterator();
while(it.hasNext()) {
    set.add(it.next()+num);
}
cs

 

2) 얕은 복사인 경우.(addAll( )을 이용하여 얕은 복사)

1
2
3
4
5
6
Set<Integer> tmpSet = new HashSet<Integer>(); 
tmpSet.addAll(set);
Iterator<Integer> it = tmpSet.iterator();
while(it.hasNext()) {
    set.add(it.next()+num);
}
cs

 

 

<결론>

굉장히 간단하고 쉬운 문제지만, 갑자기 Exception을 마주하니 당황하게 되었다. 평소 깊은 복사, 얕은 복사 별 생각없이 개발했었는데, 이런 문제를 겪어보면서 실력있는 개발자가 되기에는 갈 길이 멀다고 느꼈다. 이런 문제들도 미리 생각해서 개발하는 참 개발자가 되어야겠다.(갑자기 분위기 일기)

<서론>

프로젝트 진행 중, 전날까지 잘되던 프로젝트가 서버 구동만 하면 콘솔에 어떤 글자가 써지기도 전에 오류 메시지창이 뜨면서 서버가 시작도 하지 않는 것이다. 잘되다가 갑자기 왜 그럴까 하고 구글링.. 비슷한 에러들은 많이 보이지만 나와 같은 에러는 없었다. 아마 "프롤로그에서는 콘텐츠가 허용되지 않습니다" 라는 말이 한글이라 검색결과가 잘 안나온 것 같아 이 부분을 "Content is not allowed in prolog" 로 바꾸고 검색했더니 스택오버플로우에 나왔다. 스택오버플로우 분들 감사합니다.


 

 

<본론>

헛소리는 이쯤하고 해결법부터 적어본다.

1. Eclipse 종료
2. [workspace]/.metadata/.plugins/org.eclipse.wst.server.core 폴더로 이동
3. tmp# 폴더를 삭제(#에는 번호가 들어간다. 예. tmp0, tmp1)
4. Eclipse 실행
5. tomcat, project clean

이렇게 했더니 처음처럼 아주 잘 돌아간다.


 

 

<결론>

tmp 폴더 내의 xml 파일이 꼬여서 그런 것 같기때문에 tmp 폴더를 그냥 다 날림으로써 해결했다. 매우매우 간단한 문제였는데, 한글로 검색하니 안나오고, 영어로 검색하니 나와서 다행이었다. 순간적으로 '영어로 검색해보자!' 라는 생각을 안했다면 아마 하루종일 고생했겠지..

다시한번 스택오버플로우 회원들에게 감사한다.

 

 

<참조>

https://stackoverflow.com/questions/36196734/removing-obsolete-files-from-server-could-not-clean-server-of-obsolete-files

 

Removing obsolete files from server... Could not clean server of obsolete files: Content is not allowed in prolog

I am creating a project which is in jsp,servlet and tomcat v 8.0.upto last night it works fine but today it didn't work it gives error in publishing tomcat server,please give me any suggest...

stackoverflow.com

 

ISNULL( SUM( column ), 0 ) - 권장

SUM( ISNULL( column, 0 ) ) - 이건 성능 저하. 무의미한 함수 발생

 

Null값은 연산을 하지 않으니 굳이 NVL 혹은 ISNULL 필요 없음

 

Oracle에서는 공백('')은 null 취급하지만

MSSQL에서는 공백과 null이 다르다... 이거 주의하자!

 

 

2020.01.31 추가

Null 값은 비교할 수 없다.

예)CASE WHEN A.col = '0' THEN ...

예2) CASE WHEN ISNULL(A.col, '0') = '0' THEN -- orcale : NVL(A.col,'0')

예)와 같은 쿼리에서 많약 A.col에 Null 값이 있다면 해당 조건은 무조건 false를 반환.

예2)와 같이 Null을 처리해줘야 CASE 문이 원하는데로 작동한다.

 

A.col = Null - 잘못된 방식

A.col IS NULL - 올바른 방식

 

A.col <> Null - 잘못된 방식

A.col IS NOT NULL - 올바른 방식

 

위에도 가끔 실수한다. 잘 고치자.

 

 

MAX( ISNULL( A.col, 0 ))

ISNULL( MAX( A.col ), 0)

큰 차이는 없지만 가끔 값이 다를 수 있다. Null 처리할 땐 조심하자

+ Recent posts