Spring

    Swagger 오류: Unable to infer base url. ...

    새로 진행하는 프로젝트에서 swagger 설정을 해보았는데 아래와 같은 오류가 발생했다. 설정 오류라 얼럿으로 팝업이 출력되면서 swagger-ui.html화면으로 연결이 안 되는 현상. Unable to infer base url. This is common when using dynamic servlet registration or when the API is behind an API Gateway. The base url is the root of where all the swagger resources are served. ... (후략) @EnableSwagger2 어노테이션을 Config클래스에 달아라, 메인클래스에 달아라, 버전을 2.9.2로 낮춰라, 스프링 시큐리티와 설정 충돌 문제다 등등..

    [Kotlin] Content is not allowed in prolog.; HTTP header setting error

    Tableau api를 활용하여 개발 중, json 형태의 데이터를 보내 응답을 받아야 하는데 아래 오류가 뜨는 경우 Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.web.client.HttpClientErrorException$BadRequest: 400 Bad Request: [{"error":{"summary":"Bad Request","detail":"Deserialization problem: Content is not allowed in prolog.; ","c..

    Configuration error (css, js 파일이 Servlet을 타서 발생하는 오류)

    입사 후 과제를 하던 도중 css파일에 대한 mapping이 없다는 오류가 자꾸 뜨기 시작했다. Spring Security와 interceptor 설정을 하다가 발생했다. 로그인 인터셉터를 설정하고 싶었는데... 아래 컨피그 클래스 소스에서 Configuration Annotation을 지우면 문제 없이 돌아가지만 인터셉터가 작동하지 않고, 반대의 경우엔 인터셉터를 포기하고 css를 정상적으로 읽어오는 상황. @Configuration public class CustomWebMvcConfigurer extends WebMvcConfigurationSupport { @Override //로그인 인터셉터.. protected void addInterceptors(InterceptorRegistry regi..

    스프링 빈과 의존관계 - 자바 코드로 직접 스프링 빈 등록하기

    설정파일 별도로 만들 때 Service, Repository에 어노테이션 없이 설정파일에서 별도로 등록해주는 방법이다. XML로 설정하는 방법도 있는데 현재는 잘 사용하지 않는다. DI에는 필드 주입, setter 주입, 생성자 주입 3가지 방법이 있다. 의존관계가 실행중 동적으로 변화하는 경우가 거의 없으므로 생성자 주입을 권한다. 처음에 앱이 조립될때 생성자로 한번만 들어오고 끝남. 필드 주입은 바꿀 수 있는 방법이 없어서 좋지 않다. 상황에 따라 구현 클래스를 변경해야 하면 스프링 설정 파일을 이용해서 변경한다. package hello.hellospring; import hello.hellospring.repository.MemberRepository; import hello.hellospring..

    회원 관리 예제 #04 회원 서비스 테스트

    확실히 스프링 레거시로 프로젝트를 진행해보고서 하니까 이해가 빨리 되는 거 같다. 뒷부분엔 전혀 모르던 JPA같은 개념들이 나오니까 그 부분에선 시간이 좀 더 걸릴지도 모르겠지만 이대로라면 4월 중순이면 완강할 수 있지 않을까? 순서대로 코드만 나열. 주석으로 열심히 필기(?)해두었다. //처음에 자동완성된 코드 @Test void join() { } @Test void 회원가입() { //테스트 메소드는 과감하게 한글로 바꾸셔도 됩니다 } @Test void 회원가입() { //테스트 메소드는 과감하게 한글로 바꾸셔도 됩니다 //테스트는 아래의 3단계로 나눠진다. 아닐 때도 있지만 일단 이렇게 주석을 깔고 하는 방법을 권장함 //given: 이런 상황이 주어져서 - 이 데이터를 기반으로 하는구나 Mem..

    회원 관리 예제 #03 회원 서비스 개발

    디렉토리 구조 이제 Service 패키지를 만들었다. 여기서 비즈니스 로직을 구현한다. 코드 정리 먼저 멤버 레포지토리 객체를 생성한다. 서비스를 만들기 위해서 각종 메소드를 호출해와야 하기 때문에 클래스 내에서 공유될 객체다. 먼저 Optional 객체를 선언하여 사용한다. public class MemberService { private final MemberRepository memberRepository = new MemoryMemberRepository(); //서비스를 만들려면 우선 repository가 있어야겠죠 /** * 회원 가입 */ public Long join(Member member){ //같은 이름이 있는 중복 회원X Optional result = memberRepository..

    Spring Legacy 프로젝트에서 사용한 .gitignore 파일

    스프링 레거시... 스프링 프로젝트를 진행하면서 가장 많이 애를 먹었던 부분은 바로바로바로 깃허브 사용이다. 초기 깃이그노어 설정이 필요하긴 하지만 이렇게 어려울 일인가... 라는 생각이 많이 들었던 부분. 각 PC에서 다르게 작동할 수 있는 설정파일들과 class파일 등을 올려주어야 하는데, 캐시 문제로 gitignore를 수정해도 제대로 먹히지 않아 고생을 많이 했다. 캐시를 삭제했을 뿐인데 파일이 날아갔다거나(뭔가 다른 문제가 있었을 거라고 생각한다) 파일이 이전 소스로 버전이 떨어졌다거나(역시 뭔가 다른 문제가 아니었을까) 하는 괴상한 문제들이 중구난방으로 발생했고 깃허브에서 pull받아 실행하면 오류가 터지기 십상이라 맘고생이 가장 심했던 부분이다. 다른 블로그를 참고한 바, 아마 원격 레포와 ..

    회원 관리 예제 #02 회원 리포지토리 테스트 케이스 작성

    테스트케이스 코드를 코드로 검증한다. 개발한 기능을 실행해서 테스트 할 때 자바의 main 메서드를 통해서 실행하거나, 웹앱의 컨트롤러를 통해서 해당 기능을 실행한다. 이런 방법은 준비하고 실행하는데 오래 걸리고, 반복 실행하기가 어렵고 여러 테스트를 한번에 실행하기 어렵다는 단점이 있다. 자바는 JUnit이라는 프레임워크로 테스트를 실행해서 이러한 문제를 해결한다. 테스트 메소드는 서로 의존관계 없이 설계되어야 한다. 테스트가 하나 끝날때마다 공용 데이터를 클리어해줘야 한다. TDD: 테스트 클래스를 먼저 작성한 다음에 리포지토리를 작성하는 방법. 테스트 주도 개발방법이다. class MemoryMemberRepositoryTest { MemoryMemberRepository repository = n..

    [Spring] Multiple Pagination / 멀티페이징, 더블페이징

    파이널 프로젝트를 진행하면서 Multiple pagination in one page, 즉 한 페이지 내에서 더블 페이징 처리를 해야 할 일이 생겼다. 조금 찾아보니 과거에는 iFrame을 이용했지만 현재는 접근성에 위반되어 사용하지 않는다고. 생각해 보면 장바구니에서 선택한 상품만 하단의 구매리스트에 뿅뿅 뜨게 하는 걸 어디서 보았던것도 같고, 실무에서도 많이 쓰지 않을까? 라는 생각이 들어 시간이 촉박했지만 매달려서 구현한 부분이다. js파트가 영 맘에 안 드는데 조만간 포트폴리오를 정리한 후에 코드 정리가 좀 필요할 것 같다. 중복되는 소스가 너무 많아서... (._. 마음이 불편하다. 잘 정리하면 한 페이지에서 여러개의 페이징처리를 해도 코드가 많이 늘어나지 않도록 할 수 있을 것 같다. [Vie..

    List의 요소 제거에 람다식 적용 removeIf()

    List요소를 받아오는데 앞단에서 input 3개를 무조건 받아오게 되어있어서 1개나 2개만 받아오면 null포인터 익셉션이 떴다. 컨트롤러에서 삭제해주려고 했더니 ConcurrentModificationException이 뜨는 것. 이 익셉션은 이미 다른 파트에서 경험해 본 적이 있는데, 자바의 정책 중 fail-fast라는 정책이라고 한다. 당시 iterator를 사용하여 remove()한 적이 있는데 이번엔 NoSuchElement라고 뜨면서 그게 안 먹히는 것. 엘리먼트가 널값이라 그런게 아닐까 추측. 방법을 좀 더 찾아보다가 JAVA 1.8부터 적용된다는 람다식을 이용한 분이 있길래 따라해보았다. 코드도 간단하고 결과도 잘 나왔다. 넘 좋다.ㅠ_ㅠ //포지션 등록 승인 요청, 임시저장 @Requ..