2021-05-23-TIL

Q. 테스트 코드로 insert한 결과는 db에 반영이 안되는가?

CORS 문제

리액트로 실행되는 프론트 서버는 localhost:3000 주소를 사용하는데, JSON 데이터를 받아오는 서버가 AWS의 주소이므로 서로 오리진이 달라서 발생하는 문제이다. 이는 iOS에서는 발생하지 않으며, 프론트는 자체 서버가 구동되므로 발생하는 문제이다. 이 문제를 해결하기 위해서 임시적으로 @CrossMapping을 각 컨트롤러에 붙여주면 된다. 나중에 배포할 때는 이것을 제거하고 프론트 서버와 함께 배포하면 된다.

결론: 개발할 때는 @CrossMapping으로 배포하고, 나중에 프론트 서버랑 합칠 때는 애노테이션 빼고 프론트 서버는 Ngnix에, 백엔드 서버는 Tomcat에 올리면 된다.

@Transactional

@SpringBootTest
@Transactional
class RoomRepositoryTest {
		...
}

테스트 코드의 클래스에 아무 생각없이 붙였던 @Transactional애노테이션은 해당 테스트 코드 전체를 트랜잭션으로 보고, 별도의 커밋을 수행하지 않으면 롤백하도록 해준다. 따라서 해당 애노테이션을 없애고 Insert 쿼리를 수행하면 DB에 해당 데이터가 저장되는 것을 확인할 수 있다.

Executing prepared SQL statement
...
Rolled back transaction for test: [DefaultTestContext@3aaca039 testClass = RoomRepositoryTest, testInstance = ...

@Transactional을 붙이면 해당 로그가 출력되는데, 트랜잭션 커밋이 이루어지지 않아서 다시 롤백하는 로그가 출력된다. 테스트 코드는 테스트일 뿐이므로 롤백하는 것이 타당해보인다.

TODO

  • VPC 설정
  • 배포 자동화
  • OAuth 적용
  • Ngnix 설정 및 프론트서버 배포