본문 바로가기

Proj

(38)
Trouble Shooting - Spring Security 프로젝트에 비로그인으로 접속 시 1. 개요해당 프로젝트에서 회원 가입 시 발생했던 문제를 정리한다. 배포 준비를 위해 회원 entity에서 미사용 필드를 제거하고 Auditing 로직을 넣은 후 다음과 같은 오류가 발생했다.  문자열을 UserPrincipal(implements UserDetail)로 캐스팅하려 했다는 것이다. 이런 코드가 있었나? 바로 디버깅을 돌려봤다.2. 해결 과정소셜 로그인 클래스의 140번째 줄에서 예외가 터진 것이고이는 회원 저장 메서드였다.Auditor에서 생성자를 찾는 과정에서 authentication.getPrincipal()을 캐스팅하였고, 여기서 오류가 발생했다. 이 프로젝트에서는 JWT를 사용하여 인증 및 인가를 진행한다. 회원 가입시에는 토큰을 발급받지 않은 상태이므로 위 조건문에서 걸렸어야 ..
Trouble Shooting - docker compose vs docker-compose 1. 개요해당 포스팅의 제목이 Tripot 프로젝트를 진행하면서 발생한 오류의 원인이 되었다. 이번에는 두 명령어 간의 차이를 알아보고, 해당 실수가 어떤 결과를 초래하였는지 정리해보자.2. docker compose vs docker-compose 본론으로 들어가서 두 명령어가 어떤 차이점이 있는 지 정리해보자. 처음 이를 학습할 때는 둘 중 어떤 명령어를 사용해도 up 명령어가 정상적으로 동작하기에 차이가 없다 생각하고 넘겼었다. 하지만 다음과 같은 차이점이 존재한다. Compose V2Compose V1명령어docker composedocker-compose개발 언어pythongoword separator-(hyphen)_(underscore)scale 옵션docker compose up --sca..
스프링부트 테스트코드 작성하기: 통합 테스트 1. 개요MVC 계층의 단위 테스트를 모두 작성하였으니 이번에는 통합 테스트를 작성해보고자 한다. 2. 애노테이션@SpringBootTest@AutoConfigureMockMvc@TestPropertySource(properties = "spring.profiles.active=local")@Transactional@Import(SecurityConfig.class)@DirtiesContext(classMode = DirtiesContext.ClassMode.AFTER_EACH_TEST_METHOD)public class BaseIntegrationTest { ...} 위의 base class를 기반으로 각 클래스가 이를 상속받아 테스트를 진행한다. 각 애노테이션의 쓰임새를 알아보자.@SpringBoot..
신고 기능 구현 1. 개요이번에는 신고 기능을 구현해보았다. 신고, 신고 내역 조회, 처리 기능을 각각 구현해 볼 것이다.우선 이 프로젝트에서는 게시글 역할을 하는 스토리가 있고, 그 스토리에는 댓글을 달 수 있다. 스토리와 댓글에 따라 신고 내역에 표시되어야 하는 정보가 다르고, 이를 감안하여 기능을 구현할 예정이다. 2. ERD신고 테이블이다. 신고 타입에 따라 따로 처리를 하게 될 것이다. 이에 따라 story, comment와 다대일 관계를 맺게 되었고, 신고 타입이 story(comment)일 경우 comment(story)에는 아무것도 저장하지 않게 될 것이다.이외 처리상태, 사유, 처리 시각을 저장하도록 하였다.@Entity@Getter@Builder@NoArgsConstructor(access = Acce..
로그인 인증 과정 추가해보기 - AuthenticationProvider 커스텀 1. 개요해당 프로젝트에서는 관리자 계정으로만 Username password 방식으로 로그인이 가능해야 한다. 이전 포스팅에서의 동작을 기반으로 해당 인증과정을 추가해보고자 한다.2. AuthenticationProvider지난 포스팅에서 언급했듯이 인증 자체는 AuthenticationProvider에서 진행되고, 그 결과를 AuthenticationManager가 받는다. 인증 과정을 추가하려면 AuthenticationProvider를 수정하면 될 것이다. protected void additionalAuthenticationChecks(UserDetails userDetails, UsernamePasswordAuthenticationToken authentication) throws Aut..
application/json 형식으로 관리자 로그인 구현하기 1. 개요해당 프로젝트에서 관리자 페이지를 만들어 운영하기로 했다. 운영하게 될 서비스는 소셜 로그인만 지원하도록 했지만 관리자 페이지는 username/password 형식으로 구현하도록 할 것이다. 해당 프로젝트는 스프링 시큐리티를 사용하므로 필터를 사용하여 로그인을 구현하고자 한다.2. 사용한 코드2-1. LoginFilterpublic class JsonUsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter { private static final String DEFAULT_LOGIN_REQUEST_URL = "/api/v1/login/admin"; // /login 으로 오는 요청을 처리할 것이..
스프링부트 테스트코드 작성하기: Controller 1. 개요이전 포스팅에서 repository, service 계층의 단위 테스트를 작성해보았다. 이번에는 controller 계층의 단위테스트를 작성해보고자 한다.2. Controller@WebMvcTest(MemberController.class)@MockBean(JpaMetamodelMappingContext.class) //JPA 관련 빈들을 mock으로 등록class MemberControllerTest { @Autowired MockMvc mockMvc; @MockBean MemberService memberService; @Autowired ObjectMapper objectMapper; @Test @DisplayName("회원 활성화 완료 응..
스프링부트 테스트 코드 작성하기: Repository, Service 1. 개요지금까지 회원 관련 MVP를 구현해보았다. 해당 게시글에서는 현재까지 구현한 기능 중 회원 기능에 대한 테스트코드를 작성해보고자 한다. Repository의 테스트코드가 짧으므로 서비스 계층과 묶었다.2. Repository 계층 테스트@EnableJpaAuditing@TestConfiguration@EnableJpaRepositories(basePackages = "com.junior")//@EntityScan(basePackages = "com.junior.dto")public class TestConfig { @PersistenceContext private EntityManager entityManager; @Bean public JPAQueryFactory jpaQ..