분류 전체보기

    Java 양방향 Socket 통신시 발생한 에러(socket is closed, 무한 readLine)

    문제 Socket 공부하면서 client -> server 단방향 통신만 있길래 그대로 응답도 보낼 수 있지 않나? 해서 server에서 OutputStream을 사용해서 client에 보내니 socket is closed 에러 발생 위의 이슈 해결 이후에는 sever에서 client의 데이터를 받지 못하는 문제 발생 문제 코드 클라이언트 코드 public void sendAndReceiveSocketData(String data) { Socket socket = null; try { System.out.println("Client: Connecting"); socket = new Socket("127.0.0.1", 9999); System.out.println("Client: Connect status..

    자바 다시 학습 하면서 알게된 것(제네릭, Collection, Map)

    여태 자바를 사용법만 알고 깊이 몰라서 "자바의 신"이라는 책으로 다시 학습하고 있는데 새로 알게 된 내용만 정리해보려고 한다. CS도 외우기만 하다가 왜 이렇게 사용하는지, 어떤 원리인지 알아봤는데 기억에 더 잘 남고 이전에 이해를 100% 못했던 문제도 퍼즐이 맞춰지는 느낌으로 이해가 되어 좋았다. 자바도 비슷한 느낌을 받을 것 같아 시작했다. 제네릭 타입을 지정해서 컴파일 타임에 오류를 잡기 위해 사용하는 것으로 알고있다. 새로 알게된 내용은 static 메소드에서 제네릭을 사용하려면 앞에 와 같은 제네릭을 사용해야 한다는 것이다. 그래야 메소드가 제네릭 타입을 받아들이는 것으로 인식된다. 내가 작성했던 코드에서도 사용한 부분이 있는데 그땐 오류가 사라지니 그냥 사용했던 것 같다. public st..

    try-with-resources를 사용하면 정말 close()가 호출될까?

    Transaction을 JDBC로 작성할 때 항상 try-catch-finally을 사용해서 반납해야 하는 자원들을 close() 메소드를 호출하여 반납했다. public Member save(Member member) throws SQLException { String sql = "insert into member(member_id, money) values (?,?)"; Connection con = null; PreparedStatement pstmt = null; try{ con = getConnection(); pstmt = con.prepareStatement(sql); pstmt.setString(1, member.getMemberId()); pstmt.setInt(2, member.getM..

    [리팩토링 3] 쿼리 수정 및 최적화와 JMeter를 사용한 비교-게시판 만들기(16)

    쿼리 수정 기존에는 QueryDSL을 사용하며 DTO조회를 사용하고 있다. 이를 최대한 Entity객체를 반환하도록 수정할 것이다. 그리고 만약 수정이 힘들더라도 QueryDSL에서 조회하는 DTO와 Service단에서 응답을 위해 사용하는 DTO는 구분하여 처리할 것이다. 의존 관계를 떨어뜨리기 위함이다! 게시글 상세 정보 조회의 쿼리를 최적화하면서 내가 수정한 방법이 정말 최적화가 됐는지 테스트를 해보고 어떤 것이 더 괜찮은지 고민해 볼 것이다. QueryDSL DTO조회를 Entity조회로 바꾸기 우선 내가 이렇게 조회 방식을 바꾸는 이유는 재사용성을 높일 수 있기 때문이다. 만약 같은 게시글 조회 쿼리라도 화면에서 보여줄 내용이 다르다면 DTO조회의 경우 새로운 DTO를 사용한 메서드를 만들어야 ..

    [리팩토링 2] 의존성 관리하기 -게시판 만들기(15)

    우선 해야할 것이 크게 코드 의존성 관리를 하며 구조를 변경하는 것과 쿼리문을 수정하고 성능을 향상하기위한 2가지 작업을 할 것이다. 오늘은 의존성 관리를 하며 구조를 변경하겠다. 첫 번째로 application계층과 service계층의 역할이 명확하게 분리되지 않았다. 현재 내 비즈니스의 구조는 controller → application → service → repository와 같은 흐름인데 application과 service가 중복되는 작업을 하고 있었다. 이를 명확하게 구분하기 위해 service에 비즈니스를 처리하는 로직을 넣어 책임을 명확하게 할 것이다. 그럼 application계층은 왜 필요하지? 라는 생각이 들지만 application은 service들을 여러개 호출하는 작업에 쓰이는..

    [리팩토링 1] nGrinder삽질 + JMeter 부하 테스트 해보기 - 게시판 만들기(14)

    로그인 기능 이후 게시글과 댓글 기능까지 만들었다. 리팩토링 하기 전에 부하 테스트를 해보고 성능에 문제가 있는 것을 한 번에 리팩토링하면 좋을 것 같아 시도해 보았다. nGrinder 삽질 아래는 nGrinder 오픈소스 링크이다. 여기서 알맞은 버전을 다운로드하여 사용해야 한다. https://github.com/naver/ngrinder/releases 내가 그냥 최신버전 했다가 삽질을 엄청 했는데 현재 내 환경은 macOS Ventura 13.4.1 java openjdk8 을 사용했다. openjdk8을 사용한 이유는 8 버전이 가장 잘 된다고 한다. 11도 되는 것 같지만 시도해보지 않았다. 우선 이 환경에서 nGrinder 3.5.8 버전이 되지 않아서 3.5.6 버전을 다운로드하여서 실행하..

    [Querydsl] Spring Data JPA + Querydsl , Pageable(페이징)

    Spring Data JPA 설정 먼저 기존 Repository클래스 말고 Spring Data JPA사용을 위해 인터페이스를 생성한다. 클래스가 아닌 인터페이스이다. Spring Data JPA Repository로 변경 public interface MemberRepository extends JpaRepository { List findByUsername(String username); } Spring Data JPA는 메소드 이름을 사용하여 자동으로 JPQL을 만들어주기 때문에 이전과 다르게 EntityManager를 사용하여 직접 구현할 필요가 없다. findByUsername은 [select m from Member m where m.username = ?]과 같다. 테스트 @SpringBoo..

    [Querydsl] 순수 JPA Repository + Querydsl

    순수 JPA → Querydsl 변경 순수 JPA 사용 메소드 @Repository public class MemberJpaRepository { private final EntityManager em; private final JPAQueryFactory queryFactory; public MemberJpaRepository(EntityManager em){ this.em = em; this.queryFactory = new JPAQueryFactory(em); } public void save(Member member){ em.persist(member); } public Optional findById(Long id){ Member findMember = em.find(Member.class,id..