CORS 문제Access to XMLHttpRequest at 'http://localhost:8080/example' from origin 'http://localhost:3000' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. 리액트에서 API 서버로 요청을 보냈더니 위와 같은 메세지를 받았다.보안상 서로 다른 도메인이 서버 자원에 접근하려 하는 경우 이를 막는 것이다. CORS 설정을 통해 이 문제를 해결할 수 있다. @Configurationclass WebConfig { @Bean fun corsConfigurer(): WebMvcCo..
Spring Boot 3.2.3.RELEASE가 아니라 Spring Framework 3.2.3.RELEASE로 개발된 프로젝트에서 개발 및 유지보수를 하면서 아래와 같은 코드를 반복적으로 보았다.TransactionStatus status = this.transactionManager_iqis.getTransaction(new DefaultTransactionDefinition());try{ //do something transactionManager_iqis.commit(status);} catch (Exception e) { transactionManager_iqis.rollback(status);} 주로 @Transactional로 사용하는 기능을 코드로 사용하고 있었다. 스프링 ..
OAuth 사용자의 정보를 가지고 있는 제3의 서비스로부터 접근 권한을 위임 받아서 웹 사이트의 자원에 접근하는 방식 사용자의 정보를 저장하고 관리해야 하는 부담을 줄일 수 있다. 사용자도 자신의 개인정보를 신뢰할 수 없는 타인에게 제공하는 단점을 해결한다. OAuth 제공자는 네이버, 카카오, 구글 등이 있다. JWT Header, Payload, Signature로 구성된 암호화된 토큰 session 기반 인증 방식과 달리 stateless한 구현이 가능하다. 로그인 흐름 Resource Owner(사용자)가 Client(서버) 자원에 접근하려 하면 Resource Server(OAuth 제공자)의 로그인 창을 호출하여 인증을 요구한다. 로그인을 성공하면 Resource Server에 로그인 API..
i18n internationalization의 축약형 총 20자리 글자 중에 맨 앞 i와 맨 뒤 n을 제외한 나머지가 18글자가 있다고 해서 i18n 이다. MessageSource란? 국제화(i18n)를 지원하는 스프링 인터페이스 하나의 메세지에 대해서 다국어로 표시해주는 기능 제공 Entity 생성 @Entity @Getter @Setter public class Languages { @Id @GeneratedValue private Integer id; private String locale; private String messageKey; private String messageContent; } sample data 생성 쿼리 작성 src/main/resources 경로에 data.sql 파일..
*************************** APPLICATION FAILED TO START *************************** Description: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that's listening on port 8080 or configure this application to listen on another port. 해결 방법 1. cmd(명령프롬프트) 실행 2. netstat -ano 입력 3. PID 확인 4. taskkill /pid PID /f 입력 예) taskkill /pid 1036 /f
증상 서버에서 파일을 읽어오다가 실패하면서 console에 "net::ERR_CONTENT_LENGTH_MISMATCH 200" 출력 원인 서버에서 읽어오는 파일의 크기와 Header에 설정된 파일의 Content-Length의 크기가 달라서 발생 해결 upload 할 때 파일 크기를 추출해서 DB에 저장한다. @PostMapping("/uri") public String upload(@RequestParam("file") MultipartFile file) { Object obj = new Object(); obj.setFileSize((int) file.getSize());//MultipartFile의 getSize() 메소드로 파일 크기를 추출한다. service.insert(obj);//추출한 파..
Controller @PostMapping("/login") public String login( @RequestParam(name="email", required=true) String email, HttpSession session, ModelMap modelMap ){ if("myEmail@seogineer.com".equals(email)) { //로그인 정보를 session.setAttribute(key, value)로 등록시켜준다. session.setAttribute("isLogin", true); session.setAttribute("email", email); } } //session.getAttribute(key)로 session에 저장된 값을 읽을 수 있다. if(session.ge..
트랜잭션(Transaction) 쪼갤 수 없는 하나의 작업 단위 서비스 객체(=비즈니스 로직)는 하나의 트랜잭션으로 동작한다. 트랜잭션의 특징 1. 원자성 : 전체가 성공하거나 전체가 실패하는 것을 의미 2. 일관성 : 트랜잭션이 진행되는 동안 데이터가 변경 되더라도 처음에 트랜잭션을 진행할 때 참조한 데이터로 진행된다. 3. 독립성 : 하나의 특정 트랜잭션이 완료될때까지 다른 트랜잭션이 특정 트랜잭션의 결과를 참조할 수 없다. 4. 지속성 : 트랜잭션이 완료되었을 경우 영구적으로 반영되어야 한다. Spring에서 트랜잭션 사용 1. pom.xml에 라이브러리 추가 org.springframework spring-tx 4.3.5.RELEASE 2. web.xml에 ContextLoaderListener가..
SQL SELECT id, name, content, regdate FROM guestbook ORDER BY id DESC limit :start, :limit; --LIMIT 시작점, 갯수 Controller defaultValue="0"에 의해 처음은 0 번째부터 5개를 출력한다. 그 다음부터 pageCount에 따라 pageStartList에 5, 10, 15 등의 값이 들어갈 수 있다. @Autowired GuestbookService guestbookService; @GetMapping(path="/list") public String list(@RequestParam(name="start", required=false, defaultValue="0") int start, ModelMap mo..
실행 과정 1. 주소창에 http://~/xxxx 입력 2. DispatcherServlet → Controller : Controller에서 path가 /xxxx인 메소드 실행 3. Controller → DispatcherServlet : InternalResourceViewResolver가 가져온 return 값에 "/WEB-INF/views/"와 ".jsp"를 붙임 4. DispatcherServlet → View template : return 받은 "/WEB-INF/views/xxxx.jsp" 경로 파일 실행 (아래 DispatcherServlet 설정 참고) DispatcherServlet(=WebMvcContextConfiguration.java) 설정 @Configuration @Enab..