Spring/Tistory 42

AOP

X정리X 제어해주는거라서 핸들러에 만들어야 할 것 같지만 config에 만들자. AOP는 관점지향 프로그래밍 내가 슈퍼에 갈 수도있고 회사에 갈 수도 있는데 옷을 입는 메서드를 만들 것이다. 항상 슈퍼, 회사에 가는 젤 첫 로직에 옷 입기가 필요하다. 메서드를 따로 분리해서 재사용하면 되겠네? 동일하게 동작(동일한 코드)하는 로직이라면 그냥 메서드에 추가하면 된다. AOP를 사용하면 AController의 모든 메서드들은 .. 접근 지정자가 public인 메서드들은 .. 하면서 설정이 가능ㅎㅏ다. 이는 리플렉션 기능으로 가능한것. 반복로직을 들고있어서 번거롭게 적어주지 않아도 되지만 얘만 가지고 AOP라고 하지 않는다. 이는 핵심로직에 집중하게 해준다는 첫번째 AOP의 특징이다. A컨트롤러의 모든 메서드..

Spring/Tistory 2022.06.21

블로그-V3. MultipartFile 테스트

이제 테스트를 진행하면 TestUserDetailsService 파일이 돌게된다. 무조건 ssar 1234 ssar@nate.com이 실제 세션에 담기게 된다. mock가 아님 테스트에 세션값이 필요할 때마다 WithUserDetails를 붙여주면 된다. 프로필 이미지 업데이트 테스트를 해보자. 본코드에서 받아오는 데이터는 loginUser와 MultipartFile이다. 이 컨트롤러에서는 접근을 위한 인증만 필요한게 아니라 세션값을 사용해야하기 때문에 @WithUserDetails("ssar")을 붙여주자. 세션에 접근하기 위해 다음과 같이 해준다. // given // 세션에 접근하기 Authentication authentication = SecurityContextHolder.getContext(..

Spring/Tistory 2022.06.13

블로그-V3. JUnit 트랜잭션

mockmvc 트랜잭션이랑 스프링으로 직접 save한 트랜잭션 두 개가 같이 돌고있다. 카테고리가 아직 save 커밋이 안되어서 인식을 못하기때문에 오류가 나는거야 1. 같은 트랜잭션을 태우거나 2. 카테고리도 mockmvc로 save하거나 레파지토리 save, find하는거 다 따로 트랜잭션을 가지고있어 서비스라는 곳에서 내가 만약에 hello 메서드에서 두ㄱㅏ지 일을 할거야. a레파지토리.save( ) b레파지토리.save( ) 따로 트랜잭션이 도는데 이 두개의 따로노는 트랜잭션을 하나의 트랜잭션으로 묶기 위한 @Transactional 지금문제는 mockmvc로 post를 save하는 트랜잭션 하나, 직접 repository에 카테고리를 save하는 트랜잭션 하나 따로따로 돌고있음 카테고리는 하나 ..

Spring/Tistory 2022.06.09

블로그-V3. 3가지 설정 파일

스프링은 설정 파일의 application- 뒤에 붙는 이름을 설정 파일의 이름으로 본다. 규칙! 이 프로파일명으로 어떤 설정 파일로 프로그램을 실행시킬지 결정한다. spring: profiles: active: - dev 기본적으로 잡은 프로파일이 dev이기 때문에 특별한 설정을 해주지 않으면 dev 파일로 실행된다. 직접 프로그램을 실행해서 포스트맨을 사용해 테스트할 때는 dev로 실행하고, JUnit으로 테스트할 때는 test 파일로 실행하고 싶다. 그래야 내 DB에 영향을 미치지 않을 것 같은데? 해당 파일을 어떤 설정 파일로 실행할 지 선택할 수 있는 어노테이션 @ActiveProfiles @ActiveProfiles("test") // test 설정파일로 실행 -> h2 @SpringBootT..

Spring/Tistory 2022.06.08

블로그-V3. Security 테스트 시 주의할 점

포스트 컨트롤러의 write 메서드를 테스트 해보자. @ActiveProfiles("test") @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class PostControllerTest { private MockMvc mockMvc; @Autowired private WebApplicationContext context; @BeforeEach public void setup() { mockMvc = MockMvcBuilders .webAppContextSetup(context) // spring의 환경을 알고있어야 set .apply(SecurityMockMvcConfigurers.springSecurity()) .build()..

Spring/Tistory 2022.06.08

블로그-V3. 유저 컨트롤러 통합 테스트

컨트롤러는 통합 테스트하자. testRestTemplate.exchange("/join-form", HttpMethod.GET, null, String.class); assertEquals는 레퍼런스 주소까지 비교한다. // RestController 테스트는 통합테스트로 하면 편하다 -> TestRestTemplate // Controller 테스트는 모델 값 확인이 안되기 때문에 WebMvcTest 사용해야함 MockMvc 필요 @SpringBootTest(webEnvironment = WebEnvironment.RANDOM_PORT) public class UserControllerTest { @Autowired private TestRestTemplate testRestTemplate; @Test..

Spring/Tistory 2022.06.07

블로그-V3. 실제 프로젝트에 JUnit 적용(레파지토리, 서비스)

실제로 시큐리티가 findByUsername을 사용한다. 비밀번호를 체크하지 않는 이유는 자기가 체크할거니까 직접 하지 말라는 것이다. 내부적으로 비밀번호를 체크한다. 해시로 변경하는게 레파지토리의 책임은 아니지만 만약 다른 메서드에서 오류날 수 있기 때문에 해시로 바꿔야할 때가 있을 수 있다. @TestMethodOrder(MethodOrderer.OrderAnnotation.class) @DataJpaTest public class UserRepositoryTest { // 아무것도 의존하는게 없기 때문에 stub이 필요없음 @Autowired private UserRepository userRepository; // @DataJpaTest가 메모리에 띄워줌 @Test @Order(1) public ..

Spring/Tistory 2022.06.03

CI / CD 환경

왜 리눅스에 배포할까? 윈도우는 라이센스가 있기 때문에 비싸다. 윈도우도 서버있다! IIS 대신 배포 환경으로 사용하면 비용이 발생한다. 나는 윈도우에서 개발하고 리눅스에 던져서 배포할건데 테스트 코드를 안짰어. 포스트맨으로 테스트해보겠지. 그럼 오래 걸릴거야, 하나하나 body 데이터 넣고 눈으로 보고. 그리고 이걸 .jar파일로 만들어서 리눅스에 던져. 이때 리눅스에 jdk가 설치되어 있어야 하고, 받은 .jar 파일을 실행하면 되는데 폴더 경로도 다르고 환경도 다르기 때문에 리눅스에 던질 때 오류날 수 있어. 근데 로그를 안남기면 뭐가 잘못된지 모르니까 뇌절온다? 실제 서버에서는 출력으로만 남고 허공으로 사라지니까 내가 확인할 방법이 없지. 프로젝트가 실행되고 발생하는 에러를 OS는 에러로 보지않고..

Spring/Tistory 2022.06.02

블로그-V3. Log4j

GlobalExceptionHandler은 클라이언트에게 보여주는 로그이지, 파일로 남진 않는다. 모니터 출력만 해준다. stdout(표준(모니터) 출력) 모니터 출력 stdout(표준(모니터) 출력) 키보드 입력 stdin(표준(키보드) 입력) 내가 GUI에서 마우스 클릭을 해도 실제로는 명령어가 실행된다. 에러 stderr(표준 에러) 키보드로 표준 입력을 했을 때 2가지 결과가 나올 수 있다. 표준 출력 혹은 표준 에러 stdout, stdin, stderr는 OS가 들고있는 기능이다. 자바에서 이 기능을 사용하고 싶다면 system call해서 사용한다. System.in → 표준 입력 System.out → 표준 출력 1 (디폴트) System.err → 표준 에러 2 이게 OS의 기능을 sys..

Spring/Tistory 2022.06.02