Spring - REST방식의 데이터 교환 방식의 이해
2022. 10. 18. 17:51
Spring
과거의 웹 서비스 고정된 브라우저의 주소창 특정한 확장자를 이용하는 모델 2 방식(ex> *.do) 특정한 파라미터에 의한 분기 구조 현재의 웹 서비스 URI + 식별데이터 GET/POST외에 PUT/DELETE 등의 다양한 전송 방식 사용 서버에서는 순수한 데이터만을 서비스 하는 방식 REST방식 REST는 ‘Representational State Transfer’의 약어로 하나의 URI는 하나의 고유한 리소스(Resource)를 대표하도록 설계된다는 개념에 전송방식을 결합해서 원하는 작업을 지정 스프링에서는 다양한 어노테이션과 기능을 통해서 REST방식의 서비스를 간편하게 구축할 수 있음 어노테이션 기능 @RestController Controller가 REST 방식을 처리하기 위한 것임을 명시합니..
Git - git 의 기본 사용법과 원리
2022. 10. 11. 22:57
Git
git 이란? Git is a free and open source distributed version control system designed to handel everything from small to very large projects with speed and efficiency. Staging Area 란? > git add 파일이름 : Staging Area에 파일 추가 commit 하면 Staginf Area 에 있는 파일들이 Repository 에 저장 Staging Area 관련 명령 도움말 > git 명령어 -h : 명령어에 대한 도움말 > git 명령어 --h : 자세한 도움말 > git --help : 모든 도움말 Staging Area 에 추가 > git add 파일이름 > g..
중고헌터 - 댓글 기능 구현 4 - 대댓글
2022. 10. 10. 16:56
프로젝트/중고헌터
대댓글 버튼과 등록 버튼 만들기 등록 tmp += '답글' $("#commentList").on("click", ".replyBtn", function(){ // 1. reply 폼을 답글 밑으로 옮기고 $("#replyForm").appendTo($(this).parent()); // 2. 답글을 입력할 폼을 보여줌 $("#replyForm").css("display", "block"); }); commentTest comment: SEND 수정 등록 대댓글 정렬을 위해 commentMapper 의 selectAll 바꾸기 SELECT cno, bno, pcno, comment, commenter, reg_date, up_date FROM comment WHERE bno = #{bno} ORDER BY..
중고헌터 - 댓글 기능 구현 3 - UI 구현
2022. 10. 10. 00:39
프로젝트/중고헌터
UI 구현할 test.jsp 만들기 commentTest SEND 삭제 기능 만들기 요청이 와야 삭제 버튼이 만들어 지는데 요청이 오기 전에 삭제 버튼 코드가 실행되니 삭제 버튼을 눌러도 창이 나타나질 않는다. 그래서 이벤트를 고정된 요소인 $("#commentList") 에 건다. tmp += '삭제' // $("#.delBtn").click(function() $("#commentList").on("click", ".delBtn", function(){ alert("delBtn clicked"); }); }); commentTest SEND 삭제 테스트 // $("#.delBtn").click(function() $("#commentList").on("click", ".delBtn", function..
중고헌터 - 댓글 기능 구현 2 - Controller 작성
2022. 10. 9. 16:06
프로젝트/중고헌터
CommnetController 작성 package com.jcy.usedhunter.controller; import java.util.List; import javax.servlet.http.HttpSession; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.DeleteMapping; import org.springframework.web.bind.annotation.GetMapping; ..
중고헌터 - 댓글 기능 구현 1 - DAO와 Service의 작성
2022. 10. 8. 20:19
프로젝트/중고헌터
댓글 기능 구현 순서 1. DB테이블 생성 2. Mapper XML 작성 3. DAO 작성 & 테스트 4. Service 작성 & 테스트 5. 컨트롤러 작성 & 테스트 6. 뷰UI) 작성 & 테스트 DB테이블 생성 CREATE TABLE `usedhunter`.`comment` ( `cno` INT NOT NULL AUTO_INCREMENT, `bno` INT NOT NULL, `pcno` INT NULL, `comment` VARCHAR(3000) NULL, `commenter` VARCHAR(30) NULL, `reg_date` DATETIME NULL DEFAULT now(), `up_date` DATETIME NULL DEFAULT now(), PRIMARY KEY (`cno`)) ENGINE =..
중고헌터 - REST API와 Ajax
2022. 10. 8. 14:49
프로젝트/중고헌터
JSON 이란 Java Script Object Notation - 자바 스크립트 객체 표기법 { 속성명1 : 속성값1, 속성명2: 속성값2, ... } [{ 속성명1 : 속성값1, 속성명2: 속성값2, ... }] : 객체 배열 { 키1:{속성명1 : 속성값1,...}, 키2:{속성명2: 속성값2, ... }, ...} : Map stringify() 와 parse() JS 객체를 서버로 전송하려면, 직렬화(문자열로 변환)가 필요 서버가 보낸 데이터(JSON, 문자열)를 JS 객체로 변환할 때 역직렬화가 필요 JSON.stringify() - 객체를 JSON 문자열로 변환(직렬화 JS객체 -> 문자열) JSON.parse() - JSON 문자열을 JS 객체로 변환(역직렬화 문자열 -> JS객체) Aja..
중고헌터 - 게시판 검색 기능 구현하기
2022. 10. 6. 18:23
프로젝트/중고헌터
MyBatis의 동적 쿼리(1) - sql과 include 공통 부분을 로 정의하고 로 포함시켜 재사용 AND title LIKE concat("%", #{keyword}, "%") AND writer LIKE concat("%", #{keyword}, "%") AND (title LIKE concat("%", #{keyword}, "%") OR content LIKE concat("%", #{keyword}, "%")) WHERE TRUE ORDER BY reg_date DESC, bno DESC LIMIT #{offset}, #{pageSize} SELECT count(*) FROM board WHERE TRUE MyBatis의 동적 쿼리(2) - if MyBatis의 동적 쿼리(3) - choose..
중고헌터 - 게시판 읽기, 쓰기, 수정, 삭제 구현 2
2022. 10. 6. 01:08
프로젝트/중고헌터
글쓰기 기능 추가, boardList 에 글쓰기 버튼 추가 후 버튼 누르면 board/write로 이동 boardList.jsp 글쓰기 중고헌터 Home Board ${loginOut} Sign in 글쓰기 번호 제목 이름 등록일 조회수 ${boardDto.bno} ${boardDto.title} ${boardDto.writer} ${boardDto.reg_date} ${boardDto.view_cnt} board/write 에 빈 게시판 폼 나타내기 board.jsp bno 는 hidden 타입으로 model 에 담긴 mode 가 new 이면 제목이 게시물 글쓰기로 title, content 가 readonly 가 아니게 하기 게시물 ${mode=="new" ? "글쓰기" : "읽기"}..
Python - 리스트, 함수
2022. 10. 4. 11:29
Python
# 연습문제 2번 : 1000번 던져서 주사위 값 빈도 수 구하기 import random counters = [0, 0, 0, 0, 0, 0] for i in range(0, 1000): value = random.randint(0, 5) counters[value] = counters[value] + 1 for i in range(0, 6): print("주사위가",i+1,"인 경우는", counters[i]) # 연습문제 2번 5가지 색깔로 오각형 그리기 import turtle t = turtle.Turtle() color_list = ["yellow", "blue", "red", "orange", "green"] t.pendown() t.width(5) for i in color_list: t...
중고헌터 - 게시판 읽기, 쓰기, 수정, 삭제 구현
2022. 10. 3. 17:25
프로젝트/중고헌터
기능별 URI 정의 URL : 리소스 경로, full 경로 URI : identifier, 유일 URL, URL : 비슷함 기능 URI HTTP 메서드 설명 읽기 /board/read?bno=번호 GET 지정된 번호의 게시물을 보여준다. 삭제 /board/remove POST 게시물을 삭제한다. 쓰기 /board/write GET 게시물을 작성하기 위한 화면을 보여준다. /board/write POST 작성한 게시물을 저장한다. 수정 /board/modify?bno=번호 GET 게시물을 수정하기 위해 읽어온다. /board/modify POST 수정된 게시물을 저장한다. 읽기 기능 구현 BoardController.java read 메서드 추가 @GetMapping("read") public String..
중고헌터 - 게시판 목록 만들기
2022. 10. 3. 13:16
프로젝트/중고헌터
게시판 목록 만들기 boardList.jsp에 게시판 목록 추가 VSCode 를 사용해서 간단하게 작성 중고헌터 Home Board ${loginOut} Sign in 번호 제목 이름 등록일 조회수 ${board.bno} ${board.title} ${board.writer} ${board.reg_date} ${board.view_cnt} BoardController.java package com.jcy.usedhunter.controller; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Http..
중고헌터 - MyBatis로 DAO 작성
2022. 10. 2. 14:18
프로젝트/중고헌터
DTO(Data Transfer Object) 계층 간의 데이터를 주고 받기 위해 사용되는 객체 VO(Value Object) 라는 표현도 많이 쓰는데 VO 는 Immutable 특성을 가지고 있어서 DTO 와는 성질이 다르다. BoardDao 의 작성 1. DB테이블 작성 2. Mapper XML & DTO 작성 3. DAO 인터페이스 작성 4. DAO 인터페이스 구현 & 테스트(impl 먼저 작성하고 interface extract 해도 됨) mybatis-config.xml boardMapper.xml INSERT INTO board (title, content, writer) VALUES (#{title}, #{content}, #{writer}) SELECT bno, title, content,..
MyBatis - Mapped Statements collection does not contain value for~ 에러
2022. 10. 2. 13:40
데이터 접근 기술/MyBatis
Mapped Statements collection does not contain value for ~ 에러 발생시 확인해야 하는 부분 1. mapper id가 다를경우 - 대부분 이경우 - mapper파일에 가 중복되는지 체크 3. mapper location 세팅 확인 - 경로가 잘 잡혔는지. (프로젝트 처음 세팅을 했는데 안되는 경우 이 부분 확인) - classpath*:static/mappers/**/*Mapper.xml 이부분 (*가 없는 경우 *를 추가) org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.exceptions.PersistenceException: ### Error querying d..
중고헌터- MyBatis 설정 및 게시판 만들기 준비
2022. 10. 1. 13:58
프로젝트/중고헌터
MyBatis SQL Mapping Framework - Easy & Simple 자바 코드에서 SQL 문을 분리해서 관리 매개 변수 설정과 쿼리 결과를 읽어오는 코드를 제거 작성할 코드를 줄어서 생산성 향상 & 유지 보수 편리 MVNRepository 가서 코드 가져오자 MyBatis, MyBatis Spring 둘 다 필요함 Spring 을 5.0 이상의 버젼을 쓸 때 MyBatis 3.5 버젼 이상 MyBatis Spring 2.0 버젼 이상 써야 함 설정 root-context.xml 코드 추가 pom.xml 코드 추가 org.mybatis mybatis 3.5.9 org.mybatis mybatis-spring 2.0.7 mybatis-config.xml 추가 src / main / resour..
Spring - MyBatis 연동 시 sqlSessionFactory 오류
2022. 10. 1. 13:21
Spring
경로가 정확한데 mybatis-config.xml 을 찾지 못한다는 오류 ERROR: org.springframework.web.context.ContextLoader - Context initialization failed org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sqlSessionFactory' defined in ServletContext resource [/WEB-INF/spring/root-context.xml]: Invocation of init method failed; nested exception is org.springframework.core.NestedIOExcepti..
Spring - 서비스 계층의 분리와 @Transactional 2
2022. 10. 1. 09:01
Spring/Ch3. Spring DI, AOP
테스트를 위해 테이블 b1 생성 @Transactional 없을 때 TxService.java package com.jcy.usedhunter; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @Service public class TxService { @Autowired A1Dao a1Dao; @Autowired B1Dao b1Dao; public void insertA1WithoutTx() throws Exception { a1Dao.insert(1, 100); a1Dao.insert(1, 200); } } TxServiceTest.java package..
Spring - 서비스 계층의 분리와 @Transactional
2022. 9. 30. 18:35
Spring/Ch3. Spring DI, AOP
서비스 계층의 분리 - 비지니스 로직의 분리 RegisterController : @Controller UserService : @Service UserDao, UserHistoryDao : @Repository TrasactionManager DAO 의 각 메서드는 개별 Connection 을 사용 @Repository public class A1Dao { @Autowired DataSource ds; public int insert(int key, int value) throws Exception{ Connection conn = null; PreparedStatement pstmt = null; try { //conn = ds.getConnection(); conn = DataSourceUtils...
Spring - AOP
2022. 9. 30. 13:30
Spring/Ch3. Spring DI, AOP
AOP(Aspect Oriented Programming) 관점 지향프로그래밍, 횡단 관심사, cross-cutting concerns 부가 기능(advice)을 동적으로 추가해주는 기술 메서드의 시작 또는 끝에 자동으로 코드(advice)를 추가 AopMain.java package com.jcy.usedhunter; import java.lang.reflect.Method; public class AopMain { public static void main(String[] args) throws Exception { MyAdvice myAdvice = new MyAdvice(); Class myClass = Class.forName("com.jcy.usedhunter.MyClass"); Object ..
Git - 파일의 stage 상태와 unstage 상태
2022. 9. 29. 16:40
Git
stage, unstage 워킹 디렉터리에 있는 tracked 상태의 파일들은 스테이지 영역과 긴밀한 상관관계를 맺는다. 스테이지 영역으로 등록된 모든 파일은 untracked 상태에서 tracked 상태로 변경되고, 스테이지는 워킹 디렉터리 안에 있는 파일들의 추적 상태를 관리하는 역할을 수행한다. 스테이지 영역은 파일을 stage 상태와 unstage 상태로 구분한다. 깃이 변화 이력을 기록하려면 파일들의 최종 상태가 stage 상태여야 한다. unstage 상태라면 파일에 변화가 있다는 것을 의미 하므로, 스테이지 영역에 있는 파일과 워킹 디렉터리 안에 있는 파일 내용에 차이가 있을 때는 unstage 상태가 된다. 또 넓게 보면 아직 스테이지 영역으로 등록하지 않은 워킹 디렉터리 안의 파일도 un..