스프링

    인공지능 기반 웹 서비스 만들기

    인공지능 기반 웹 서비스 만들기

    낙서하듯이 그린 그림을 멋진 그림으로 바꿔주는 인공지능 기반 웹 서비스를 개발하고 있다. 이번 포스팅에서는 프로젝트를 진행하면서 고민했던 부분에 대해서 적어볼려고 한다. 프로젝트 구조 GPU 가상 서버는 비싸기에 로컬 컴퓨터를 이용하여 프로젝트를 진행했다. Ubuntu기반의 가상 머신을 Nginx로 사용하였으며 URL기준으로 프론트, 백엔드 포트로 포워딩해준다. 백엔드 서버는 요청으로 들어온 사진을 인공지능 서버에 가공 요청한다. 인공지능 서버의 작업이 완료되면 결과를 메일로 전송한다. Ubuntu 가상 머신을 사용한 이유 로컬PC를 이용해 다른 작업도 하다 보니 제한된 메모리와 자원을 할당하고 관리하고 싶었다. 가상환경에서, 특히 VirtualBox에서 GPU사용이 생각보다 까다로웠다. 프로젝트 기능 ..

    OSIV 필터와 지연로딩 에러

    OSIV 필터와 지연로딩 에러

    🔍 관련 포스팅 OSIV와 필터 🔍 OSIV란? (Open Session In View) 스프링의 트랜잭션 범위는 Service, Repository 레이어에서만 유지된다. 보통 JPA의 영속성 컨텍스트는 트랜잭션의 생명주기를 따라가는데, OSIV를 이용하면 영속성 컨텍스 brightmango.tistory.com 🔍 @AuthenticationPrincipal과 지연 로딩 @AuthenticationPrincipal 어노테이션을 이용하면 간편하게 session에 저장한 객체를 쉽게 받을 수 있다. 그런데 파라미터로 받은 객체를 가지고 지연 로딩을 하면 프록시 객체를 가지고 있기 때문에 에러가 발생한다. 현재 SecurityContextHolder에 session을 저장하는 코드는 인터셉터에 다음과 같이..

    [토비 스프링] CH4-1. 예외처리

    [토비 스프링] CH4-1. 예외처리

    초난감 예외처리 자바를 처음 배우면 예외처리를 다음과 같이 try-catch문을 써서 처리한다. try { ... } catch(SQLException e) { } 예외가 발생하는 것을 catch블록을 써서 잡아내는 것은 좋은데 아무것도 하지 않고 별문제 없는 것처럼 넘어가 버리는 건 위험한 일이다. (리소스 소진, 예상치 못한 다른 문제를 야기한다.) 다음과 같은 코드들도 잘못 된 예외 처리 방식이다. 오류 메세지는 출력해주지만, 다른 로그나 메세지에 금방 묻혀버려 놓치기 쉽다. catch(SQLException e) { System.out.println(e); } catch(SQLException e) { System.out.println(); } 모든 예외는 적절하게 복구되든지 아니면 작업을 중단시..

    [JPA] 영속성 컨텍스트의 생명주기(feat.OSIV)

    [JPA] 영속성 컨텍스트의 생명주기(feat.OSIV)

    [문제 상황] 사용자 회원가입이 잘 되는지 확인하기 위해 다음과 같은 테스트 코드를 작성했다. "영속성 컨텍스트에 user 정보가 저장되어서 같은 영속성 컨텍스트에 있는 user와 newUser는 같은 객체가 된다"라고 생각했는데 테스트 케이스가 실패하였다. 확인해보니 user가 null로 나온다. ??? 그렇다면 왜 이 테스트 케이스는 실패하는가? 이를 위해 userService.save()의 코드를 살펴보았다. [분석] 먼저 내가 알고 있는 지식이 잘못된 것인지 확인하였다. [JPA의 객체 비교] 객체를 비교하는 방식에는 총 2가지가 있다. 1. 동일성 비교 (== 비교) 2. 동등성 비교 (equals()) JPA에서는 같은 트랜잭션일 때는 같은 객체임이 보장된다. 따라서 다음은 동일성 비교에서 t..

    MyBatis, MySql, Spring Boot를 이용한 간단 예제

    MyBatis, MySql, Spring Boot를 이용한 간단 예제

    [도입] 자바에서는 데이터베이스를 이용하기 위해 JDBC API를 이용하는데, 개발자가 작성해야 하는 코드가 너무 많아 불편했다. 이런 JDBC를 사용하기 쉽게 SQL Mapper를 이용한 MyBatis의 간단 예제를 살펴보자. [MyBatis 동작 원리] 1. 애플리케이션이 시작되면 SqlSessionFactoryBuilder는 MyBatis 설정 파일을 참고해서 SqlSessionFactory를 생성한다. 2. 애플리케이션에서 Sql 요청이 들어오면 SqlSession을 생성한다. 3. 생성한 SqlSession는 수행하는 쿼리문이 담겨져 있는 mapper를 참고하여 DB작업을 수행한다. [Mapper Interface] MyBatis 3.0이전에는 xml파일에 쿼리 명령문을 작성했어야 했는데, 3...