Self Project(ICN-APP) 일기 #1

최우혁·2021년 1월 6일
0

ICN_APP

목록 보기
1/7

백엔드 프레임워크 중 Spring에 대해 공부를 하다가, 혼자서 side project를 진행하면 좋겠다 싶어서 앱을 간단하게 제작 중에 있었다.

Client : Flutter를 이용한 모바일 크로스 플랫폼
Server : Spring Boot
DB : Azure DB

이렇게 구성을 하고 추가적으로 Azure에서 Linux Server를 하나 준비해놨다.
Docker를 이용해서 Spring Boot jar 파일을 Linux에 띄워놓기 위함이다.

대충 이런 느낌인데... 좀 더 고도화 시켜서 KafkaELK Stack 도 넣어볼 생각이다.

앱의 시나리오는?

메인 화면 : 여러가지 서브 화면으로 들어갈 수 있는 호텔 로비와 같은 느낌
첫번째 화면 : 달력을 이용하여 등록된 일정을 보여주고, 새로 일정을 등록하거나 기존의 일정을 삭제할 수 있는 화면
두번째 화면 : 등록된 사용자의 명단을 가져오는 화면

아직 구상하고 실제로 구현한 것은 이정도 단계밖에 되지 않는다.

사실 결과물의 방향성이 교회에서 내가 맡고 있는 부서(학생부)에서 사용했으면 좋겠다 싶은 것을 위주로 생각하다보니, 각각의 일정을 관리하는 전용 앱이 있으면 좋겠다는 생각이 크게 작용했다.

Spring Security를 이용해서 권한 및 로그인 설정을 구현해야 하지만, 아직 미처 공부를 다 하지 못했기에 앱을 설치하게 되는 모든 사용자들은 서로가 올린 내역을 모두가 볼 수 있도록 되어있다....

현 시점의 문제는...?

이 글을 작성하게 된 계기가 문제 발생으로 인함이다.

사실 나는 그냥 기능만 문제없이 잘 되면 상관없다는 생각에 DB를 통한 CRUD 방식을 mybatis로 쉽게 구현을 하였다.
그런데 ORM이라는 개념을 마주하면서 재밌어보여 JPA를 적용해보자! 라는 꿈을 갖고 시도를 했다.
그리고 이제 이야기 하게 될 문제를 마주하게 된다.

일단 사용자의 명단을 저장해놓은 teacher라는 테이블이 DB에 있다.
그래서 일단 되는지 테스트를 하기 위해 findAll()을 사용했다. (물론 Entity, Service, Repository 다 구현했다)

Entity 코드

@Entity(name="teacher")
public class teacherDTO{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer teacherNo;
    
    @Column(length=100,nullable = false)
    private String name;
    
    @Column(length=100,nullable = false)
    private String birthday;
    
    public String getName() {
        return name;
    }

    public String getBirthday() {
        return birthday;
    }
}

Repository 코드

@Repository
public interface teacherDAO extends JpaRepository<teacherDTO,Integer>{
}

Service 코드

@Service
public class teacherDAOImpl{
    @Autowired
    teacherDAO teacherdao;

    public ArrayList<teacherDTO> findAll(){
        ArrayList<teacherDTO> members = new ArrayList<>();
        teacherdao.findAll().forEach(e->members.add(e));
       
        return members;
    }
}

Controller 코드

@RestController
@RequestMapping(value="/example")
public class TeacherController {
    @Autowired
    teacherDAOImpl teacher;

    @GetMapping(value="/all")
    public List<teacherDTO> findAll(){
        return teacher.findAll();
    }
}

당연히 될 줄 알았지만, 결과는 stackoverflow였다.

Postman을 이용해서 테스트를 하였고, 에러 로그를 보니 동일한 작업을 계속 반복하여 메모리 초과로 인한 stackoverflow 였다.
실제로 동일한 로그가 여러번 반복해서 나타났고, Debug를 해보니 findall()을 들어갔다 나왔다 들어갔다를 계속 반복하더라...
'findBy컬럼명()'을 이용해서 조건에 맞는 row를 찾는건 또 잘되는데, 전체를 불러오는 findall()만 안된다.

그래서 고수 형님들의 사례를 찾기 위해 부단히 노력했지만, N+1 번 접근에 대한 이슈만 90%이상이 검색이 되었다... (나는 이런 상황이 아닌데...나는 단일 테이블이라구요...)

그러다 발견한 글이 이 글이었다.
나와 동일한 상황이었다. 그런데 해결책은 없더라...(😳😳)
결국 Spring에서 버그로 등록이 된 건가..?

그래서 Spring Initializr를 이용해 새로운 프로젝트를 만들어서 저 코드 그대로 해봤더니, 너무나도 성공적으로 잘 받아온다! ^^ (너무 화가났다..)

동일한 코드인데 이건 되고 저건 안되길래 프로젝트를 아예 갈아엎어야되나 생각하던 찰나에 해외 개발자 형님께서 그 위에 @Query()를 이용해 직접 작성하면 해결이 된다 하여 그렇게 해보니 됐다...!

아무튼 왜 안되는지도 모르지만, 어찌저찌 해결 방법은 찾게 되어 기쁜 마음에 첫 글을 작성해 보았다! 자러가야겠다😭😭

profile
백엔드 주니어입니다🙌

0개의 댓글