스프링(Spring)

    [Spring Boot] CORS 설정 시 addCorsMappings 관련 에러

    CORS 설정 시 addCorsMappings 관련 에러 java.lang.IllegalArgumentException: When allowCredentials is true, allowedOrigins cannot contain the special value "*"since that cannot be set on the "Access-Control-Allow-Origin" response header. To allow credentials to a set of origins, list them explicitly or consider using "allowedOriginPatterns" instead. 스프링 부트에서 CORS 설정 시, .allowCredentials(true)와 .allowedOr..

    [JPA] Infinite Recursion

    JPA Infinite Recursion JPA를 활용하여 양방향 매핑을 선언했을 때 아래와 같은 에러가 발생할 수 있다. org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.http.converter.HttpMessageNotWritableException: Could not write JSON: Infinite recursion 컨트롤러에서 JSON 형태로 값을 출력할 때, 타입 변환이 필요하다. 이때 변환해야하는 엔티티의 필드가 다른 엔티티와 매핑 관계로 연결되어있다면 참조를 진행한다. 그리고, 이 연결된 엔티티에서도 함께 연결된 기존의 ..

    Lombok 사용 시 주의할 점

    @Data 사용 지양 해당 어노테이션은 @ToString, @EqualsAndHashCode, @Getter, @Setter, @RequiredArgsConstructor을 모두 갖춘 강력한 어노테이션임 무분별한 사용은 오히려 부작용을 가져올 수 있음(Setter 남용 금지 등) 순환 참조 대비 두 객체가 양방향 연관관계 일때, toString()을 호출하면 무한 순환 참조의 문제가 발생한다. 따라서 @ToString 어노테이션을 통해 제외시켜줘야 한다. @ToString(exclude = "대상객체") @NoArgsConstructor 접근 권한 최소화 기본 생성자를 만들 때는 접근 권한을 protected로 설정한다. @NoArgsConstructor(access = AccessLevel.PROTEC..

    [Spring Data JPA] 더티 체킹 (Dirty Checking)

    [Spring Data JPA] 더티 체킹 (Dirty Checking) 트랜잭션 안에서 Entity의 변경이 일어났을 때 변경한 내용을 자동으로 DB에 반영하는 것 ORM 구현체 개발 시 더티 체킹이라는 말을 자주 볼 수 있다. 더티 체킹이 어떤 것을 뜻하는 지 간단히 살펴보자. JPA로 개발하는 경우 구현한 한 가지 기능을 예로 들어보자 ex) 주문 취소 기능 @Transactional public void cancelOrder(Long orderId) { //주문 엔티티 조회 Order order = orderRepository.findOne(orderId); //주문 취소 order.cancel(); } orderId를 통해 주문을 취소하는 메소드다. 데이터베이스에 반영하기 위해선, update와..

    [Spring Boot] Test Code

    [Spring Boot] Test Code 테스트 코드를 작성해야 하는 이유 개발단계 초기에 문제를 발견할 수 있음 나중에 코드를 리팩토링하거나 라이브러리 업그레이드 시 기존 기능이 잘 작동하는 지 확인 가능함 기능에 대한 불확실성 감소 개발 코드 이외에 테스트 코드를 작성하는 일은 개발 시간이 늘어날 것이라고 생각할 수 있다. 하지만 내 코드에 오류가 있는 지 검증할 때, 테스트 코드를 작성하지 않고 진행한다면 더 시간 소모가 클 것이다. 1. 코드를 작성한 뒤 프로그램을 실행하여 서버를 킨다. 2. API 프로그램(ex. Postman)으로 HTTP 요청 후 결과를 Print로 찍어서 확인한다. 3. 결과가 예상과 다르면, 다시 프로그램을 종료한 뒤 코드를 수정하고 반복한다. 위와 같은 방식이 얼마나..

    [Spring Boot] SpringApplication

    스프링 부트로 프로젝트를 실행할 때 Application 클래스를 만든다. 클래스명은 개발자가 프로젝트에 맞게 설정할 수 있지만, 큰 틀은 아래와 같다. @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } @SpringBootApplication 어노테이션을 통해 스프링 Bean을 읽어와 자동으로 생성해준다. 이 어노테이션이 있는 파일 위치부터 설정들을 읽어가므로, 반드시 프로젝트의 최상단에 만들어야 한다. SpringApplication.run()으로 해당 클래스를 run하면, 내장 WAS를 실행한다...

    [Spring] MVC Framework

    Spring MVC Framework 스프링 MVC 프레임워크가 동작하는 원리를 이해하고 있어야 한다 클라이언트가 서버에게 url을 통해 요청할 때 일어나는 스프링 프레임워크의 동작을 그림으로 표현한 것이다. MVC 진행 과정 클라이언트가 url을 요청하면, 웹 브라우저에서 스프링으로 request가 보내진다. Dispatcher Servlet이 request를 받으면, Handler Mapping을 통해 해당 url을 담당하는 Controller를 탐색 후 찾아낸다. 찾아낸 Controller로 request를 보내주고, 보내주기 위해 필요한 Model을 구성한다. Model에서는 페이지 처리에 필요한 정보들을 Database에 접근하여 쿼리문을 통해 가져온다. 데이터를 통해 얻은 Model 정보를 C..

    [스프링 부트] windows & linux에서 파일 절대 경로 맞추기

    로컬 pc로 스프링 부트 프로젝트를 작업하다가, aws ec2로 배포하게 되면 운영중인 rds나 데이터베이스에 대한 세부정보를 외부로부터 숨겨야한다. (비밀번호 등등) 다양한 방법이 있겠지만, 나는 내 로컬 pc와 linux의 절대 경로를 활용했다. 나는 rds와 mariadb 정보가 담겨있는 yml 파일을 따로 로컬과 linux app 폴더에 저장한 뒤, 스프링 부트의 application.java에서 조건문으로 나눠줬다. 자바에서는 'os.name'에 대한 프로퍼티를 시스템에서 얻으면 내가 어떤 운영체제를 활용하고 있는지 값을 받아올 수 있다. String os = System.getProperty("os.name").toLowerCase(); 만약 로컬(윈도우)라면 os에는 "win"이 저장된다. ..

    Spring Boot 동작 환경

    1. 웹 브라우저에서 url(localhost:8080/hello)을 보낸다. 2. url을 받은 내장 톰켓 서버는 맵핑되는 컨트롤러에게 넘겨준다 (→ helloController) 3. 맵핑된 컨트롤러에서 model에 데이터를 담아 return해준다. 4. 컨트롤러가 return으로 반환해주는 model을 viewResolver가 템플릿을 찾아서 뿌려준다. 5. 변환된 html을 다시 웹 브라우저에게 제공해준다. 출처 : 링크 [무료] 스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술 - 인프런 | 강의 스프링 입문자가 예제를 만들어가면서 스프링 웹 애플리케이션 개발 전반을 빠르게 학습할 수 있습니다., 스프링 학습 첫 길잡이! 개발 공부의 길을 잃지 않도록 도와드립니다. 📣 확..

    [Spring Boot & React] Polling 웹애플리케이션 만들기 - 2부

    [Spring Boot & React] Polling 웹애플리케이션 만들기 - 2부 1부 : 프로젝트 생성 및 기본 도메인 모델과 레포지토리 생성 최종적으로 만들어지는 페이지는 아래와 같다. 지난 시간에 이어서, 이번에는 JWT 인증과 함께 Spring Security 구성 및 로그인과 회원가입에 대한 API를 만들어보도록 하겠다. 처음 접하면 상당히 내용이 어렵고 복잡해보인다. 일단 진행과정을 익히며 익숙해지도록 노력해보자! Spring Security와 JWT를 통한 사용자 인증 구축하기 사용자가 웹 애플리케이션에 회원가입하고, 로그인할 수 있는 API를 만들 것이다. 우선 진행하기에 앞서, 어떤 식으로 인증과정을 설계할건지 요약해보자 - 새로운 사용자를 Full Name, UserName, Emai..

    [Spring Boot & React] Polling 웹애플리케이션 만들기 - 1부

    [Spring Boot & React] Polling 웹애플리케이션 만들기 - 1부 Spring Boot와 React를 연동하여 Polling 웹앱을 만들어보려고 한다. CalliCoder에서 진행하는 Tutorial을 참고해서 다시 재구성해봤다. (링크) 최종적으로 만들어지는 페이지는 아래와 같다. [구성] Back-End - Spring Boot (Spring Security와 JWT 인증을 활용한 백엔드 서버 구축) - Database는 MySQL 활용 (JPA) Front-End - React 스프링 부트 프로젝트 생성하기 http://start.spring.io/에 접속해서 프로젝트를 생성해보자 자신의 프로젝트에 맞게 설정해주면 된다. 기본적으로 Dependencies는 Web, JPA, MyS..

    Vue CLI + Spring Boot 연동하여 환경 구축하기

    Vue CLI + Spring Boot 연동하여 환경 구축하기 프론트엔드는 Vue.js로, 백엔드는 Spring Boot를 이용해서 프로젝트를 진행하려고 한다. 스프링에서 Jsp를 통해 view를 구축해봤지만, 이번엔 Vue.js를 활용해서 View를 모두 넘겨주려고 한다. 스프링에서 컨트롤러를 통해 DB 관리나 데이터에 관한 비즈니스 로직을 잘 처리하고, 이에 대한 값을 활용해 Vue에서 화면으로 뿌려줄 탬플릿을 만들어나가는 진행 방식이 되지 않을까 생각된다. 개발 툴은 VS Code로 진행한다. VS Code 다운로드 Download Visual Studio Code - Mac, Linux, Windows Visual Studio Code is free and available on your favo..

    [스프링] 스프링 MVC 흐름도 요약

    스프링 MVC 구성 : 디스패처 서블릿, 뷰 리졸버, 인터셉터, 핸들러, 핸들러 매핑, 뷰 등 1. 디스패처 서블릿이 클라이언트로부터 요청을 받음 2. 요청을 처리할 수 있는 핸들러를 찾아야 함. 핸들러 매핑에게 물어봄 3. 핸들러 매핑은 요청한 url을 보고 핸들러 이름을 알려줌. 이때 핸들러 실행하기 전/후에 처리할 것을 인터셉터로 만들어 줌 4. 디스패처 서블릿은 해당하는 핸들러에게 제어권을 넘겨줌 5. 핸들러는 응답에 필요한 서비스를 호출하고, 렌더링해야 하는 뷰 이름을 판단해 디스패처 서블릿에게 전송해줌 6. 디스패처 서블릿은 받은 뷰 네임을 뷰 리졸버에게 전달해서 응답에 필요한 뷰를 만들라고 명령 7. 이때 해당하는 뷰에 모델과 컨트롤러를 전달해서 원하는 응답을 생성해서 보내줌 8. 받은 응답..

    [스프링] 스프링 부트란?

    스프링 프레임워크를 활용할 때, 생각보다 복잡한 초기 설정으로 인해서 빨리 포기하는 사람들도 많습니다. DispatcherServlet 설정하고, jdbc 연결하고, xml 설정해주고.. 톰캣으로 서버 연결하고.. 이를 자동화시켜 빠르게 스프링으로 개발을 할 수 있도록 도와주는 것이 바로 '스프링 부트'입니다. MVC모듈의 DispatcherServlet, JDBC 설정을 제공해주며, 복잡한 XML을 설정해 줄 필요가 없습니다. 또한 임베디드 톰캣이 내장되어 있어서 별다른 추가 설치 없이 main 메소드를 실행할 수 있습니다. 시작하기 전, 기본 개념 간단 요약 컨테이너란?- 웹 어플리케이션이 배포되는 공간 WAS( Web Application Server )- JSP, PHP 등을 사용해 동적 페이지들..

    의존성 주입 - DI(Dependency injection)

    스프링을 시작하면, 가장 먼저 배우게 되는 핵심 내용은 바로 DI인데요. Dependency injection으로 의존성 주입이라는 뜻입니다. 바로 뼈대를 만들어놓고, 세부적인 요소가 변경되어도 쉽게 수정할 수 있도록 설계한 프로그래밍 기법이라고 말할 수 있겠습니다.스프링 컨테이너가 지원하는 핵심 개념 중 하나가 바로 의존성 주입입니다. 예를 들어볼게요. 클래스 A는 안에서 B를 생성해 가져오고, b의 a 메소드를 실행시키고 있습니다. 즉, '클래스 A는 클래스 B에 의존'하고 있다고 말할 수 있겠습니다. ( A has a B ) 이는 상당히 번거로운 문제점을 가지고 있는데요.만약 A에서 새로운 클래스인 C를 의존하고 싶어서 변경해야 한다고 생각해봅시다. 우리는 클래스 A안에서 B에 관련된 instanc..

    스프링 프레임워크(Spring Framework) 시작

    JSP와 Servlet을 통해 MVC패턴에 대한 원리를 어느정도 익히고나면, 바로 스프링 프레임워크에 대해 배우기 시작하는데요. 자바 개발자들의 표준과도 같은 스프링은, 동적인 웹사이트를 개발하기 위한 여러가지 서비스를 제공하는 툴입니다, 우리가 기존의 JSP와 서블릿을 나누어 MVC를 구현했는데, 이제 스프링 프레임워크를 사용하면서 좀 더 편하게 개발할 수 있게 됩니다. 스프링의 큰 주요 기능으로는 DI, AOP, MVC, JDBC를 제공한다는 점인데요. 앞으로 차차 배워보도록 하겠습니다. 스프링에 내재되어있는 다양한 모듈을 xml 파일을 이용해서 의존 설정을 해주며 사용하게 되겠습니다. 이클립스를 통해 스프링 개발을 하실 분들은, 메뉴바에서 marketplace를 통해 자신의 버전에 맞는 'STS'를..