👩💻 BackEnd 썸네일형 리스트형 트랜잭션 격리 수준(Isolation Levels) 트랜잭션 격리 수준이란?: 동시에 여러 트랜잭션이 처리될 때, 트랜잭션끼리 얼마나 서로 고립되어있는지를 나타내는 것즉, 특정 트랜잭션(a)이 다른 트랜잭션(b)에서 변경한 데이터를 볼 수 있도록 허용할지 말지를 결정하는 것이다.트랜잭션 격리 수준의 종류READ UNCOMMITTED :어떤 트랜잭션의 변경 내용이 Commit, rollback 에 상관없이 다른 트랜잭션에서 보여짐.문제점 : 데이터 정합성 문제가 발생할 수 있음.예시 :A트랜잭션에서 이름을 MOUSE에서 MINI로 변경한다.아직 커밋을 하지 않음.B트랜잭션에서 MOUSE의 이름을 조회함.아직 커밋을 하지 않았음에도 불구하고 MINI로 조회가 됨. -> 이를 DIRTY READ라고 함.만약, A트랜잭션에서 문제가 발생해서 커밋을 하지 못하고.. 더보기 [일경험 / oracle] 프로시저 활용한 조회수 기능 구현 ✅ 프로시저를 구현하게 된 계기 일경험 프로그램에서 게시판 기본적인 기능 구현을 마친 뒤 새로운 기능을 하나 추가하는 과제를 진행하게 되었다. 바로 데이터베이스에서 비즈니스 로직을 수행할 수 있는 프로시저 기능을 활용하여 조회수를 카운트하는 기능이었다. ✅ 프로시저가 뭔가? 프로시저프로시저는 PL/SQL 을 통해서 만들어짐.데이터 베이스 내에서 실행 가능한 저장된 프로그램프로시저는 SQL 쿼리와 제어구조를 포함할 수 있으며 데이터 베이스의 복잡한 작업을 수행하는 데 사용됨.프로시저는 코드의 재사용성, 유지 보수성, 성능 향상, 보안 등을 위해 사용됨.특징저장된 프로그램 : 프로시저는 데이터베이스 내에 저장. 한 번 작성된 후 여러번 호출할 수 있다.파라미터로 입력값을 받을 수 있고, 출력값을 반환받.. 더보기 [ Spring ] Controller 에서 데이터를 어떤 형태로 받아야하는가? (@RequestBody, @RequestParam) 📌 개인적으로 헷갈려서 작성하게 된 글입니다. 참고자료는 아래 링크 참고 1. form 데이터 @RequestBody- 폼 태그로 데이터를 전송 시 메서드의 변수명 상관이 없지만, @PostMapping("/reply")public string reply(@RequestBody String request){ return "result";} @RequestParam- 폼 태그로 데이터 전송 시 데이터를 저장하는 이름으로 메서드의 변수명을 설정해주어야 함. name 을 전송한다는 가정하에 같은 변수 명으로 받아줘야 한다. @PostMapping("/reply")public string reply(@RequestParam String name){ return "result";}2. Json 형식의 데이터 서.. 더보기 JSP에서 data set 활용하기 대댓글 구현 시 JSP에서 HTML 요소에 데이터를 저장하고 활용할 수 있다고 한다. 대댓글을 구현하기 위해서는 해당 댓글의 부모 댓글 아이디 값을 계속 가지고 있다가 넘겨줘야 하는데 이때 data set을 활용하면 매우 간편해진다. 그리고 이 저장한 값을 javascript 나 서버에서 해당 댓글의 대댓글을 식별하는데 사용할 수 있다. 이를 위해 HTML 요소에 'data-*' 속성을 사용할 수 있다. 특정 댓글에 답글달기 버튼을 클릭할 때 해당 댓글의 식별자를 javascript 로 가져와 서버로 전송하여 대댓글을 생성한다. .. 더보기 [ Spring / fileUpload ] File Upload / File Download 기능 구현 개발 환경 sts 4 mybatis oracle xe 11g요구사항파일 업로드 각 게시글 업로드 시 파일 첨부파일 저장 시 게시글 별로 폴더 새로 생성해서 저장uuid + 업로드 파일 이름 형식으로 파일 저장 파일 다운로드 다운로드 받을 때는 uuid가 없는 원본 파일 이름으로 다운로드 파일 업로드 // 컨트롤러 @PostMapping("/board/write")public String insertBoard(BoardListDto dto, Model model, HttpSession session) throws Exception { Long userId = (Long) session.getAttribute(SessionConst.USER_ID); if (userId == null) { .. 더보기 [ Spring / Spring Boot ] 스프링 인터셉터 활용하여 인가작업 처리하기 ✅ 인터셉터를 활용하게 된 배경 게시판 프로젝트를 혼자서 공부하면서 만들던 중 드디어 로그인 이후 사용자의 요청을 구분해야하는 시기가 다가왔다! 로그인한 사용자들은 게시글 작성, 수정, 삭제 등을 할 수 있어야하고, 로그인하지 않은 사용자들은 게시글 조회 등의 작업을 할 수 있다. 그렇게 되면 게시글 작성, 수정, 삭제 로직마다 세션을 확인해서 세션을 갖고 있는 사용자인지 확인을 하는 로직을 아마 매번 넣어야할텐데매요청마다 이러한 로직을 작성하는 것은 코드의 중복을 초래한다. 이를 위해 따로 메서드를 작성하여 해당 메서드를 컨트롤러 단에서 처리할 수 있겠지만그러한 *공통 관심사는 다른 방법으로 해결하는 것이 바람직할 것 같다는 생각이 들었다. 사실 나는 부트캠프에서 프로젝트를 진행하면서 항상 .. 더보기 interceptor 3가지 메서드 스프링 MVC 흐름request -> Dispatcher Servlet -> Handler Mapping -> *preHandle -> Controller -> *postHandle -> ViewResolver -> View -> response -> *afterCompletion() - Handler Adapter 의 세가지 메서드 1. preHandle- 컨트롤러 실행 전, 즉 컨트롤러로 요청이 들어가기 전에 수행된다. 그리고 return 시 true 이면 컨트롤러 uri로 가고, false이면 컨트롤러 요청을 하지 않는다. 2. postHandle- 컨트롤러(핸들러) 실행하고 나서 뷰 실행 전, 즉 컨트롤러의 핸들러 처리가 끝나 return 되고 뷰 화면을 response 하기 직전에 post.. 더보기 [ Jquery / javascript] textarea 값 가져오기 function maxlengthCheck() { var content = $('textarea#content').val(); if (content.length > 100000) { alert("본문 내용은 100,000자 이내여야 합니다."); return false; }} 더보기 이전 1 2 3 4 ··· 10 다음