Skip to content

Commit aa0f208

Browse files
committed
JDBC 드라이버를 검사할 때, 부모 클래스 로더는 검사하지 않음 (#41)
1 parent 24f6e16 commit aa0f208

5 files changed

Lines changed: 115 additions & 98 deletions

File tree

part-last/my-board-mds/src/main/java/org/fp024/servlet/listener/JDBCDriverCleaner.java

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,38 +13,42 @@
1313
@WebListener
1414
public class JDBCDriverCleaner implements ServletContextListener {
1515
protected void deregisterJdbcDrivers(ServletContext servletContext) {
16+
ClassLoader contextClassLoader = servletContext.getClassLoader();
17+
ClassLoader parentClassLoader =
18+
contextClassLoader != null ? contextClassLoader.getParent() : null;
19+
LOGGER.debug(
20+
"### 현재 서블릿 컨텍스트의 클래스 로더: {}",
21+
contextClassLoader != null
22+
? contextClassLoader.getClass().getName()
23+
: "Bootstrap ClassLoader");
24+
LOGGER.debug(
25+
"### 현재 서블릿 컨텍스트의 부모 클래스 로더: {}",
26+
parentClassLoader != null
27+
? parentClassLoader.getClass().getName()
28+
: "Bootstrap ClassLoader");
29+
1630
Collections.list(DriverManager.getDrivers())
1731
.forEach(
1832
driver -> {
1933
ClassLoader driverClassLoader = driver.getClass().getClassLoader();
20-
ClassLoader contextClassLoader = servletContext.getClassLoader();
21-
ClassLoader parentClassLoader =
22-
contextClassLoader != null ? contextClassLoader.getParent() : null;
23-
2434
LOGGER.debug(
2535
"### {} 드라이버의 클래스 로더: {}",
26-
driver.getClass().getCanonicalName(),
36+
driver.getClass().getName(),
2737
driverClassLoader != null
28-
? driverClassLoader.getClass().getCanonicalName()
29-
: "Bootstrap ClassLoader");
30-
LOGGER.debug(
31-
"### 현재 서블릿 컨텍스트의 클래스 로더: {}",
32-
contextClassLoader != null
33-
? contextClassLoader.getClass().getCanonicalName()
34-
: "Bootstrap ClassLoader");
35-
LOGGER.debug(
36-
"### 현재 서블릿 컨텍스트의 부모 클래스 로더: {}",
37-
parentClassLoader != null
38-
? parentClassLoader.getClass().getCanonicalName()
38+
? driverClassLoader.getClass().getName()
3939
: "Bootstrap ClassLoader");
4040

41-
if (driverClassLoader == contextClassLoader || driverClassLoader == parentClassLoader) {
41+
if (driverClassLoader == contextClassLoader) {
4242
try {
4343
DriverManager.deregisterDriver(driver);
44-
LOGGER.info("### {} 드라이버 등록 해제", driver.getClass().getCanonicalName());
44+
LOGGER.info("### {} 드라이버 등록 해제", driver.getClass().getName());
4545
} catch (SQLException ex) {
46-
LOGGER.warn("### {} 드라이버 등록 해제 실패", driver.getClass().getCanonicalName(), ex);
46+
LOGGER.warn("### {} 드라이버 등록 해제 실패", driver.getClass().getName(), ex);
4747
}
48+
} else {
49+
LOGGER.debug(
50+
"### {} 드라이버 skip (웹앱/서블릿 컨텍스트 클래스 로더가 로드한 드라이버가 아님)",
51+
driver.getClass().getName());
4852
}
4953
});
5054
}

part-last/my-board-spring5/src/main/java/org/fp024/servlet/listener/JDBCDriverCleaner.java

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,39 +13,42 @@
1313
@WebListener
1414
public class JDBCDriverCleaner implements ServletContextListener {
1515
protected void deregisterJdbcDrivers(ServletContext servletContext) {
16+
ClassLoader contextClassLoader = servletContext.getClassLoader();
17+
ClassLoader parentClassLoader =
18+
contextClassLoader != null ? contextClassLoader.getParent() : null;
19+
LOGGER.debug(
20+
"### 현재 서블릿 컨텍스트의 클래스 로더: {}",
21+
contextClassLoader != null
22+
? contextClassLoader.getClass().getName()
23+
: "Bootstrap ClassLoader");
24+
LOGGER.debug(
25+
"### 현재 서블릿 컨텍스트의 부모 클래스 로더: {}",
26+
parentClassLoader != null
27+
? parentClassLoader.getClass().getName()
28+
: "Bootstrap ClassLoader");
29+
1630
Collections.list(DriverManager.getDrivers())
1731
.forEach(
1832
driver -> {
1933
ClassLoader driverClassLoader = driver.getClass().getClassLoader();
20-
ClassLoader contextClassLoader = servletContext.getClassLoader();
21-
ClassLoader parentClassLoader =
22-
contextClassLoader != null ? contextClassLoader.getParent() : null;
23-
2434
LOGGER.debug(
2535
"### {} 드라이버의 클래스 로더: {}",
26-
driver.getClass().getCanonicalName(),
36+
driver.getClass().getName(),
2737
driverClassLoader != null
28-
? driverClassLoader.getClass().getCanonicalName()
29-
: "Bootstrap ClassLoader");
30-
LOGGER.debug(
31-
"### 현재 서블릿 컨텍스트의 클래스 로더: {}",
32-
contextClassLoader != null
33-
? contextClassLoader.getClass().getCanonicalName()
34-
: "Bootstrap ClassLoader");
35-
LOGGER.debug(
36-
"### 현재 서블릿 컨텍스트의 부모 클래스 로더: {}",
37-
parentClassLoader != null
38-
? parentClassLoader.getClass().getCanonicalName()
38+
? driverClassLoader.getClass().getName()
3939
: "Bootstrap ClassLoader");
4040

41-
if (driverClassLoader == contextClassLoader
42-
|| driverClassLoader == parentClassLoader) {
41+
if (driverClassLoader == contextClassLoader) {
4342
try {
4443
DriverManager.deregisterDriver(driver);
45-
LOGGER.info("### {} 드라이버 등록 해제", driver.getClass().getCanonicalName());
44+
LOGGER.info("### {} 드라이버 등록 해제", driver.getClass().getName());
4645
} catch (SQLException ex) {
47-
LOGGER.warn("### {} 드라이버 등록 해제 실패", driver.getClass().getCanonicalName(), ex);
46+
LOGGER.warn("### {} 드라이버 등록 해제 실패", driver.getClass().getName(), ex);
4847
}
48+
} else {
49+
LOGGER.debug(
50+
"### {} 드라이버 skip (웹앱/서블릿 컨텍스트 클래스 로더가 로드한 드라이버가 아님)",
51+
driver.getClass().getName());
4952
}
5053
});
5154
}

part-last/my-board/src/main/java/org/fp024/servlet/listener/JDBCDriverCleaner.java

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,38 +13,42 @@
1313
@WebListener
1414
public class JDBCDriverCleaner implements ServletContextListener {
1515
protected void deregisterJdbcDrivers(ServletContext servletContext) {
16+
ClassLoader contextClassLoader = servletContext.getClassLoader();
17+
ClassLoader parentClassLoader =
18+
contextClassLoader != null ? contextClassLoader.getParent() : null;
19+
LOGGER.debug(
20+
"### 현재 서블릿 컨텍스트의 클래스 로더: {}",
21+
contextClassLoader != null
22+
? contextClassLoader.getClass().getName()
23+
: "Bootstrap ClassLoader");
24+
LOGGER.debug(
25+
"### 현재 서블릿 컨텍스트의 부모 클래스 로더: {}",
26+
parentClassLoader != null
27+
? parentClassLoader.getClass().getName()
28+
: "Bootstrap ClassLoader");
29+
1630
Collections.list(DriverManager.getDrivers())
1731
.forEach(
1832
driver -> {
1933
ClassLoader driverClassLoader = driver.getClass().getClassLoader();
20-
ClassLoader contextClassLoader = servletContext.getClassLoader();
21-
ClassLoader parentClassLoader =
22-
contextClassLoader != null ? contextClassLoader.getParent() : null;
23-
2434
LOGGER.debug(
2535
"### {} 드라이버의 클래스 로더: {}",
26-
driver.getClass().getCanonicalName(),
36+
driver.getClass().getName(),
2737
driverClassLoader != null
28-
? driverClassLoader.getClass().getCanonicalName()
29-
: "Bootstrap ClassLoader");
30-
LOGGER.debug(
31-
"### 현재 서블릿 컨텍스트의 클래스 로더: {}",
32-
contextClassLoader != null
33-
? contextClassLoader.getClass().getCanonicalName()
34-
: "Bootstrap ClassLoader");
35-
LOGGER.debug(
36-
"### 현재 서블릿 컨텍스트의 부모 클래스 로더: {}",
37-
parentClassLoader != null
38-
? parentClassLoader.getClass().getCanonicalName()
38+
? driverClassLoader.getClass().getName()
3939
: "Bootstrap ClassLoader");
4040

41-
if (driverClassLoader == contextClassLoader || driverClassLoader == parentClassLoader) {
41+
if (driverClassLoader == contextClassLoader) {
4242
try {
4343
DriverManager.deregisterDriver(driver);
44-
LOGGER.info("### {} 드라이버 등록 해제", driver.getClass().getCanonicalName());
44+
LOGGER.info("### {} 드라이버 등록 해제", driver.getClass().getName());
4545
} catch (SQLException ex) {
46-
LOGGER.warn("### {} 드라이버 등록 해제 실패", driver.getClass().getCanonicalName(), ex);
46+
LOGGER.warn("### {} 드라이버 등록 해제 실패", driver.getClass().getName(), ex);
4747
}
48+
} else {
49+
LOGGER.debug(
50+
"### {} 드라이버 skip (웹앱/서블릿 컨텍스트 클래스 로더가 로드한 드라이버가 아님)",
51+
driver.getClass().getName());
4852
}
4953
});
5054
}

part07/ex06-board/src/main/java/org/fp024/servlet/listener/JDBCDriverCleaner.java

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,39 +11,42 @@
1111
@Slf4j
1212
public class JDBCDriverCleaner implements ServletContextListener {
1313
protected void deregisterJdbcDrivers(ServletContext servletContext) {
14+
ClassLoader contextClassLoader = servletContext.getClassLoader();
15+
ClassLoader parentClassLoader =
16+
contextClassLoader != null ? contextClassLoader.getParent() : null;
17+
LOGGER.debug(
18+
"### 현재 서블릿 컨텍스트의 클래스 로더: {}",
19+
contextClassLoader != null
20+
? contextClassLoader.getClass().getName()
21+
: "Bootstrap ClassLoader");
22+
LOGGER.debug(
23+
"### 현재 서블릿 컨텍스트의 부모 클래스 로더: {}",
24+
parentClassLoader != null
25+
? parentClassLoader.getClass().getName()
26+
: "Bootstrap ClassLoader");
27+
1428
Collections.list(DriverManager.getDrivers())
1529
.forEach(
1630
driver -> {
1731
ClassLoader driverClassLoader = driver.getClass().getClassLoader();
18-
ClassLoader contextClassLoader = servletContext.getClassLoader();
19-
ClassLoader parentClassLoader =
20-
contextClassLoader != null ? contextClassLoader.getParent() : null;
21-
2232
LOGGER.debug(
2333
"### {} 드라이버의 클래스 로더: {}",
24-
driver.getClass().getCanonicalName(),
34+
driver.getClass().getName(),
2535
driverClassLoader != null
26-
? driverClassLoader.getClass().getCanonicalName()
27-
: "Bootstrap ClassLoader");
28-
LOGGER.debug(
29-
"### 현재 서블릿 컨텍스트의 클래스 로더: {}",
30-
contextClassLoader != null
31-
? contextClassLoader.getClass().getCanonicalName()
32-
: "Bootstrap ClassLoader");
33-
LOGGER.debug(
34-
"### 현재 서블릿 컨텍스트의 부모 클래스 로더: {}",
35-
parentClassLoader != null
36-
? parentClassLoader.getClass().getCanonicalName()
36+
? driverClassLoader.getClass().getName()
3737
: "Bootstrap ClassLoader");
3838

39-
if (driverClassLoader == contextClassLoader
40-
|| driverClassLoader == parentClassLoader) {
39+
if (driverClassLoader == contextClassLoader) {
4140
try {
4241
DriverManager.deregisterDriver(driver);
43-
LOGGER.info("### {} 드라이버 등록 해제", driver.getClass().getCanonicalName());
42+
LOGGER.info("### {} 드라이버 등록 해제", driver.getClass().getName());
4443
} catch (SQLException ex) {
45-
LOGGER.warn("### {} 드라이버 등록 해제 실패", driver.getClass().getCanonicalName(), ex);
44+
LOGGER.warn("### {} 드라이버 등록 해제 실패", driver.getClass().getName(), ex);
4645
}
46+
} else {
47+
LOGGER.debug(
48+
"### {} 드라이버 skip (웹앱/서블릿 컨텍스트 클래스 로더가 로드한 드라이버가 아님)",
49+
driver.getClass().getName());
4750
}
4851
});
4952
}

part07/jex06-board/src/main/java/org/fp024/servlet/listener/JDBCDriverCleaner.java

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,39 +13,42 @@
1313
@WebListener
1414
public class JDBCDriverCleaner implements ServletContextListener {
1515
protected void deregisterJdbcDrivers(ServletContext servletContext) {
16+
ClassLoader contextClassLoader = servletContext.getClassLoader();
17+
ClassLoader parentClassLoader =
18+
contextClassLoader != null ? contextClassLoader.getParent() : null;
19+
LOGGER.debug(
20+
"### 현재 서블릿 컨텍스트의 클래스 로더: {}",
21+
contextClassLoader != null
22+
? contextClassLoader.getClass().getName()
23+
: "Bootstrap ClassLoader");
24+
LOGGER.debug(
25+
"### 현재 서블릿 컨텍스트의 부모 클래스 로더: {}",
26+
parentClassLoader != null
27+
? parentClassLoader.getClass().getName()
28+
: "Bootstrap ClassLoader");
29+
1630
Collections.list(DriverManager.getDrivers())
1731
.forEach(
1832
driver -> {
1933
ClassLoader driverClassLoader = driver.getClass().getClassLoader();
20-
ClassLoader contextClassLoader = servletContext.getClassLoader();
21-
ClassLoader parentClassLoader =
22-
contextClassLoader != null ? contextClassLoader.getParent() : null;
23-
2434
LOGGER.debug(
2535
"### {} 드라이버의 클래스 로더: {}",
26-
driver.getClass().getCanonicalName(),
36+
driver.getClass().getName(),
2737
driverClassLoader != null
28-
? driverClassLoader.getClass().getCanonicalName()
29-
: "Bootstrap ClassLoader");
30-
LOGGER.debug(
31-
"### 현재 서블릿 컨텍스트의 클래스 로더: {}",
32-
contextClassLoader != null
33-
? contextClassLoader.getClass().getCanonicalName()
34-
: "Bootstrap ClassLoader");
35-
LOGGER.debug(
36-
"### 현재 서블릿 컨텍스트의 부모 클래스 로더: {}",
37-
parentClassLoader != null
38-
? parentClassLoader.getClass().getCanonicalName()
38+
? driverClassLoader.getClass().getName()
3939
: "Bootstrap ClassLoader");
4040

41-
if (driverClassLoader == contextClassLoader
42-
|| driverClassLoader == parentClassLoader) {
41+
if (driverClassLoader == contextClassLoader) {
4342
try {
4443
DriverManager.deregisterDriver(driver);
45-
LOGGER.info("### {} 드라이버 등록 해제", driver.getClass().getCanonicalName());
44+
LOGGER.info("### {} 드라이버 등록 해제", driver.getClass().getName());
4645
} catch (SQLException ex) {
47-
LOGGER.warn("### {} 드라이버 등록 해제 실패", driver.getClass().getCanonicalName(), ex);
46+
LOGGER.warn("### {} 드라이버 등록 해제 실패", driver.getClass().getName(), ex);
4847
}
48+
} else {
49+
LOGGER.debug(
50+
"### {} 드라이버 skip (웹앱/서블릿 컨텍스트 클래스 로더가 로드한 드라이버가 아님)",
51+
driver.getClass().getName());
4952
}
5053
});
5154
}

0 commit comments

Comments
 (0)