목록JAVA (11)
개발일기장
아니 Copilot은 무적인가? 그냥 대충 말해도 찰떡같이 말하고 순서도를 그려주는 코드를 작성해준다. 이렇게까지 해주는데 내가 공부를 할 필요가 있을까 생각이 든다. 1. newInstance()시점평소에 소스코드만 보고 설정값은 안봤는데 여기서 Transaction에서 순서가 끊어짐을 느꼈다.분명 DataSource에서 connection은 가지고 오는데 남는것은 session만 있는게 아닌가? 그래서 하나씩 끼워맞추면서 이해는 했는데 이부분 정리가 필요한 것 같다. SqlSessionManager에서 Connection을 가지고 오는 순서도를 그려달라고 했다.일단 여기까지는 문제가 없다. 문제는 getConnection부분이다. build나 create같은거는 application 시작 시점에 그대..
연휴라서 시간이 남는다.이것저것 하느라 바빠서 이제서야 고민해볼 시간이 생긴것 같다.. 아직도 의문인게 왜 회사에서 직접 프레임워크를 만들어쓰는지다. 뭐 특별한게 있으면 모르겠는데 몇몇 부분 빼면 죄다 Springboot에서 구현이 가능함Application에서 DB접속 관련해서도 라이브러리를 그냥 사용하지 않고 상속받아서 커스텀을 한다. 의미있는지는 모르겠는데 모니터링 용도로 그렇게 만든 것 같다. DataSource를 상속받아서 직접 만들고, Apache Common Pool을 가져다가 GenericObjectPool을 이용해서 커스텀이 되어있는 상태다. 회사소스를 가지고 올 수 없기 때문에 대충 Copilot한태 만들라고 했다. Custom GenericObjectPool 구현import org.a..
일반 java proxy 말고 CGLIB에서 제공하는 proxy사용법 1. MethodInterceptor를 구현 methodProxy 객체가 있는것 말고는 여기까지는 비슷함 그리고 method.invoke보다 저게 더 빠르다고 하는데 몰루겠슴. @Slf4j public class TimeMethodInterceptor implements MethodInterceptor { private final Object target; public TimeMethodInterceptor(Object target) { this.target = target; } @Override public Object intercept(Object obj, Method method, Object[] args, MethodProxy ..
Proxy 사용법. 1. InvocationHandler를 구현한 객체를 만듬 생성자에 실제 method를 수행할 객체를 넣어줘야함.. 그리고 다른것도 넣어도 될듯..? args에는 method를 호출 했을 때 넣어주는 인자값들. @Slf4j public class TimeInvocationHandler implements InvocationHandler { private final Object target; public TimeInvocationHandler(Object target) { this.target = target; } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { log..
일단 class를 이렇게 만들어 둠 static class Hello{ private Integer iValue = 10; public String sValue = "hello"; public String callA(String args){ log.info("call A"); return "A "+args; } public String callB(String args){ log.info("call B"); return "B"; } } 1. Class 정보 호출 // Class 정보 획득 Class classHello = Class.forName("hello.proxy.jdkdynamic.ReflectionTest$Hello"); // 내부에 있는 경우 $ 이렇게 하면 해당 파일에 위치한 class의 me..
SQLP자격증 공부하는 것 때문에 DB단에서의 transaction은 많이 봤었는데 웹서버 단에서는 따로 공부를 하지 않았음.. 그냥 쿼리에 for update를 사용한다거나, 아니면 서버에서 transaction시작 ~ 끝 소스코드 추가하는 정도.. 일단 모든 transaction의 시작은 connection을 받아오는것으로 부터 시작됨 그리고 그 connection같은 경우 jdbc에서 interface에서 추상화 되어있기 때문에 로직이랑 완벽?하게 분리 할 수 있음 conn.setAutoCommit(false); /* connection을 사용한 logic의 수행 select 문에서 for update를 사용하지 않으면 굳이 저렇게 사용할 필요는 없긴함 DML 을 위한 작업임 */ if( 성공시 )..
데이터베이스 커넥션을 획득하기 위한 복잡한 과정.. 1. 애플리케이션 로직은 DB 드라이버를 통해 커넥션을 조회한다. 2. DB 드라이버는 DB와 TCP/IP 커넥션을 연결한다. 물론 이 과정에서 3 way handshake 같은 TCP/IP 연결을 위한 네트워크 동작이 발생한다. 3. DB 드라이버는 TCP/IP 커넥션이 연결되면 ID, PW와 기타 부가정보를 DB에 전달한다. 4. DB는 ID, PW를 통해 내부 인증을 완료하고, 내부에 DB 세션을 생성한다. 5. DB는 커넥션 생성이 완료되었다는 응답을 보낸다. 6. DB 드라이버는 커넥션 객체를 생성해서 클라이언트에 반환한다. 이렇게 나와있다 단순히 local에서 확인하는 정도면 느낄 수 없겠지만, 대량의 transaction 이 발생하는 상황에..
JDBC(Java Database Connectivity)는 Java에서 db에 접속 하고 사용할 수 있도록 하는 API임 대표적으로 3가지 기능을 Interface로 정의해서 제공을 해줌 Connection(연결) / Statement(쿼리쏘기) / ResultSet(결과) 근대 이거는 그냥 Interface이기 떄문에 각각의 벤더사가 자기의 제품에 맞게 저거를 상속받고 구현을 해야함 그래서 JDBC를 사용할 떄 원하는 회사(Oracle, Mysql, DB2, PostgreSQL)의 jdbc를 import 하면 되는 부분임 (근대 interface는 동일하지만 sql쿼리 문법은 조금씩 되는게 있고 안되는게 있기 때문에 주의) 일단 DB를 켜주자 리눅스면 systemctl start mysql 하면 될듯..