전체 글

전체 글

    Git 깃 커밋 메시지 작성 규칙(git commit message convention)

    Git 깃 커밋 메시지 작성 규칙(git commit message convention)

    Git Commit Message 작성 규칙 깃 커밋 메시지 작성할 때 일관성 없이 작성을 하게 되면 가독성이 매우 떨어지고, 특히 협업을 할 경우 이러한 문제는 더욱 드러나게 된다. 때문에 깃 커밋 메시지를 작성 시 일관성 있는 규칙을 지켜 작성하는 것이 좋다. 다음은 Udacity Git 커밋 메시지 스타일 가이드이다. ## Message Structure 깃 커밋 메시지는 제목/본문/꼬리말로 구성되며 작성 시 개행으로 서로를 구분하여 작성해준다. type: Subject body footer Type 제목에 해당하는 부분 feat: 새로운 기능을 추가 fix: 버그 수정 docs: 문서 수정 style: 포맷팅, 코드 변경 없는 수정 refactor: 리팩토링 test: 테스트 코드 chore: 빌..

    Spring @ControllAdvice와 @ExceptionHandler로 전역 예외처리 하기

    Spring @ControllAdvice와 @ExceptionHandler로 전역 예외처리 하기

    @ExceptionHandler `@ExceptionHandler`는 특정 예외가 발생했을 때 해당 예외를 처리하는 메서드를 정의할 수 있습니다. `@ExceptionHandler`는 적용 범위 제한이 있는데, `@Contoller`, `@RestController`, `@ControllerAdvice`에서 사용이 가능합니다. 컨트롤러가 적용된 Bean에서 발생하는 예외를 잡고 해당 예외가 설정된 `@ExceptionHandler`가 적용된 메서드가 실행됩니다. @Controller public class demoController { //... @ExceptionHandler(Exception.class) public ResponseEntity handleException(Exception ex) { ..

    Google Login (OAuth2.0: Open Authorization)

    Google Login (OAuth2.0: Open Authorization)

    Google 서비스 등록 https://console.cloud.google.com/getting-started Google Cloud console console.cloud.google.com 1.새 프로젝트 생성 2.생성한 프로젝트 선택 사이드에 있는 네비게이션 바에서 아래 이미지 처럼 클릭 3.사용자 인증 정보 -> OAuth 클라이언트 ID 만약 OAuth 동의를 하지 않은 상태면 아래 버튼을 클릭하여 OAuth 동의를해준다. OAuth 동의를 했다면 3-2) 단계로 넘어가자. 3-1)OAuth 동의 채울 수 있는 부분을 채워준 후 [2:범위] 단계로 넘어간다. 사용자의 정보를 어느 범위까지 액세스할 수 있는지 결정하는 곳이다. 테스트할 사용자의 메일을 입력해준다. 3-2) OAuth 클라이언트 ..

    Thymeleaf에서 Spring Security 이용

    Thymeleaf에서 Spring Security 이용

    설정 implementation 'org.thymeleaf.extras:thymeleaf-extras-springsecurity5' 코드 Member Page ADMIN ROLE MANAGER ROLE USER ROLE ADMIN OR MANAGER ROLE 인증한 경우 익명인 경우(인증한 경우를 제외한 경우) Authenticated username: Authenticated user roles: 모든 권한을 가진 1user@dutmdcjf.com으로 접속한 경우 USER 권한만 가진 100user@dutmdcjf.com으로 접속한 경우

    로그인 처리를 위한 UserDetailsService

    로그인 처리를 위한 UserDetailsService

    https://yeo-computerclass.tistory.com/347 [spring security] Spring Security 흐름 / 인증(Authentication) & 인가(Authorization) Spring Security 흐름 Filter(필터) Spring Security의 웹 인프라는 표준 서블릿 필터를 기반으로 합니다. Spring Security 내부에 여러 개의 필터가 각자 특정 책임을 갖고 Request를 처리하는 필터 체인(Filter.. yeo-computerclass.tistory.com 위 포스팅한 글을 먼저 읽고오는 것을 추천한다. UserDetailsService 위 글에서 "UserDetailsService 인터페이스의 구현체가 사용자의 정보와 사용자가 가진 ..

    WebSecurityConfigurerAdapter Deprecated

    WebSecurityConfigurerAdapter Deprecated

    WebSecurityConfigurerAdapter Deprecated 이유 시큐리티 설정 클래스를 사용하려 WebSecurityConfigurerAdapter 클래스를 상속받으려 했는데 스프링 부트 2.7, Spring Security 5.7 이후 버전부터 WebSecurityConfigurerAdapter 클래스가 Deprecated 되었다. 해결: WebSecurityConfigurerAdapter 대체 이에 대한 대처 방법으로 공식 문서를 확인하면 된다. 공식 문서에 나와있는 여러 대체 방법 중 HttpSession 기반인 HttpSecurity 기반 부분을 옮겨적도록 하겠다. HttpSecurity 구성 변경 전: WebSecurityConfigurerAdapter를 상속 @Configurati..

    Spring Security 프로젝트 시작

    Spring Security 프로젝트 시작

    의존성 추가 Spring Boot DevTools Spring Web Lombok Thymeleaf Spring Data JPA MariaDB Driver dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-security' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation '..

    Spring Thymeleaf 살펴보기

    Spring Thymeleaf 살펴보기

    Thymeleaf (타임리프) ? 타임리프는 Spring Framework를 사용하는 개발자들에게 JSP 대신 쓰이는 템플릿 엔진입니다. HTML 5를 준수하는 형태로 기술할 수 있기 때문에 타임리프는 웹 어플리케이션에 적합한 템플릿 엔진입니다. 요즘 서비스에서는 JSP와 타임리프는 잘 쓰이진 않습니다. 백엔드에서는 데이터를 JSON으로 전달하고 프론트엔드에서는 리액트나 뷰로 전달받은 데이터를 가공하기 때문입니다. 타임리프가 최근 자주 쓰이는 용도로는 백엔드에서 간단히 관리자(Admin) 페이지를 만드는 경우입니다. 같이 협업해서 결과를 산출하는 실무에서는 잘 쓰이진 않지만 공부하는 차원에서 포스팅하도록 하겠습니다. Thymeleaf 사용 설정 dependencies { implementation 'or..

    [MySQL] port 변경하기

    [MySQL] port 변경하기

    MariaDB의 포트를 3306으로 설정해줌으로 MySQL의 포트를 따로 설정해주어야 했다. 포트(port)를 변경하기 위해선 다음과 같은 과정을 거치면 된다. 1. my.ini 수정 기본 설정으로 MySQL을 다운로드 하였다면 my.ini의 경로는 다음과 같을 것이다. 경로: C:\ProgramData\MySQL\MySQL Server 8.0 my.ini 파일에서 두 군데 port 번호를 변경해주어야 한다. 2. 서비스에서 MySQL 재구동 my.ini에서 설정한 포트로 정상적으로 구동된다.

    Maria DB 설치

    Maria DB 설치

    1. Maria DB 설치 홈페이지로 이동 https://mariadb.org/ MariaDB Foundation - MariaDB.org … Continue reading "MariaDB Foundation" mariadb.org 2. Download Mirror에 Korea가 없어서 Taipei로 Download 하였다. 3. 다운받은 파일 실행 UTF-8을 체크해주어야 한글이 정상적으로 출력된다. 4. 설치 진행 만약 [Next]를 눌렀을 때 TCP port가 이미 사용중이라고 나오면 아마 대부분은 MySQL을 사용하다가 MaraiDB를 설치하려는 경우일 것이다. 이때는 당황하지 말고 [리소스 모니터]에 들어가 3306 port 사용처를 본다. [명령 프롬프트] > [관리자 실행] > taskkil..

    Spring Security @PreAuthorize, @PostAuthorize, @Secured

    Spring Security @PreAuthorize, @PostAuthorize, @Secured

    Spring Security에서 메서드 수준 접근 제어를 위해 사용되는 어노테이션들이 있습니다. 이 어노테이션들을 사용하여 메서드의 실행 전후에 인가 검사를 수행하여 접근 권한을 제어할 수 있습니다. @PreAuthorize 메소드가 실행되기 전에 인가(Authorization)를 검사하는데 사용됩니다. 메소드의 실행 전에 지정된 스프링 EL(SpEL) 표현식을 평가하고, 표현식이 true인 경우에만 메소드가 실행됩니다. 인가 검사를 통과하지 못하면 예외가 발생하며, 메소드 실행은 중지됩니다. @PreAuthorize("hasRole('ROLE_ADMIN')") public void deleteUser(int userId) { // ... } @PostAuthorize 메소드 실행 후에 인가(Author..

    스프링 시큐리티를 이용한 로그인

    스프링 시큐리티를 이용한 로그인

    실행 결과 1) boardList에서 글작성 클릭 시 로그인 창 출력 로그인을 하지 않아도 글을 보거나 게시판 목록 접근 가능하지만 글 등록은 로그인하여야 함 2) ROLE_ADMIN 권한을 갖고 있는 아이디 비밀번호로 접속 3) 게시글 작성 4) 해당 게시글 확인 5. 테이블 설계 ▶member 테이블 create table member( userid varchar(50) primary key, userpw varchar(100) not null, username varchar(100) not null, regdate datetime not null default current_timestamp, updatedate datetime, enabled char(1) default '1' ); ▶member..

    Spring Security Session을 이용한 구현 예제

    Spring Security Session을 이용한 구현 예제

    설정에 대한 설명보다는 기능 중점으로 설명을 하기 위해 Spring Boot를 활용하여 간단한 예제를 작성해보도록 하겠습니다. Token 방식을 활용한 것이 아닌 기본 Session 방식을 이용하여 Spring Security를 구현한 예제입니다. 추후에 Token 방식을 활용한 예제를 포스팅하도록 하겠습니다. 의존성 설정 dependencies { // Spring Security implementation 'org.springframework.boot:spring-boot-starter-security' } 보안 구성 파일 작성: WebSecurityConfig.java `WebSecurityConfigurerAdapter`를 상속하고 `@EnableWebSecurity` 어노테이션으로 활성화합니다...

    Spring Security 스프링 시큐리티 이해하기

    Spring Security 스프링 시큐리티 이해하기

    Spring Security Spring Security는 Spring 기반 애플리케이션에서 `보안` 기능을 쉽게 통합할 수 있도록 도와줍니다. 주로 `인증`과 `인가`를 처리하며 사용자의 신원 확인과 권한 부여를 담당합니다. Spring Security의 기능들을 나열하자면 다음과 같습니다. 인증(Authentication) 사용자의 신원을 확인(증명)하고 인증하는 기능을 제공합니다. 사용자가 제공한 자격 증명(아이디/비밀번호 등)을 검증하고, 인증된 사용자에게 접근 권한을 부여합니다. 다양한 인증 방식을 지원하며, 사용자 정의 인증 프로세스를 구현할 수 있습니다. 인가(Authorization) 인증된 사용자에 대한 권한 부여 및 접근 제어를 처리합니다. 사용자의 역할, 권한, 리소스에 대한 접근 권..

    [MyBatis + MySQL] INSERT 시 PK값 가져오기

    [MyBatis + MySQL] INSERT 시 PK값 가져오기

    코딩을 하던 중 PK 값이자 자동 증가하는 id 값을 가져와야 할 일이 생겼다. MySQL 자체 문법으로도 가능한 방법이 있지만 MyBatis에서도 기능이 있다 해서 포스팅해보겠다. Oracle 같은 경우 아래와 같은 방법으로 안되기 때문에 다른 방법(selectKey 태그 사용)으로 구현해야 하기 때문에 따로 찾아보길 바란다. INSERT INTO board( title, content, writer, views ) values( #{title}, #{content}, #{writer}, 0 ) useGeneratedKeys insert나 update됨가 동시에 자동생성된 키를 가져올 수 있는 속성으로 true로 설정 (default: false) keyProperty 리턴 될 key property ..

    [springMVC + Ajax] 게시판 첨부파일 추가

    테이블 추가 ▶attach 테이블 create table attach( uuid varchar(100) primary key, uploadPath varchar(200) not null, fileName varchar(100) not null, fileType char(3) default 'I', board_id bigint ); ALTER TABLE attach ADD FOREIGN KEY(board_id) REFERENCES board(id); uuid: UUID가 포함된 파일 이름 uploadPath: 실제 파일이 업로드된 경로 fileName: 파일 이름 fileType: 파일 종류, 이미지 파일 여부 확인 board_id: 해당 게시물 번호 저장(board 테이블, 외래키 역할) DTO ▶Boa..

    Spring + Ajax 파일 다운로드 시 Internet Explorer, Edge에서 한글이름 깨짐

    기존 코드 @GetMapping(value = "/download", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) @ResponseBody public ResponseEntity downloadFile(String fileName) { Resource resource = new FileSystemResource("D:\\upload\\" + fileName); String resourceName = resource.getFilename(); HttpHeaders headers = new HttpHeaders(); try { headers.add("Content-Disposition", "attachment; filename=" + new String(re..

    Spring + Ajax 파일 다운로드

    첨부파일 다운로드 UploadController.java @GetMapping(value = "/download", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) @ResponseBody public ResponseEntity downloadFile(String fileName) { Resource resource = new FileSystemResource("D:\\upload\\" + fileName); String resourceName = resource.getFilename(); HttpHeaders headers = new HttpHeaders(); try { headers.add("Content-Disposition", "attachment; ..

    Spring + Ajax 섬네일 파일 생성, 이미지 파일인지 구분, 이미지 클릭 시 원본 이미지 출력

    섬네일 Thumbnailator 라이브러리를 사용하하여 섬네일 파일 생성 설정 ▶pom.xml net.coobird thumbnailator 0.4.8 이미지 파일인지 구분 섬네일은 이미지 파일에만 적용할 수 있기 때문에 이미지 파일인지 구분한다. 아래 코드에 이미지 파일인 경우 섬네일 파일을 생성하는 것을 확인할 수 있다. private boolean checkImageType(File file) { try { String contentType = Files.probeContentType(file.toPath()); return contentType.startsWith("image"); } catch (IOException e) { e.printStackTrace(); } return false; } ..

    Spring + Ajax 중복된 파일 이름 해결

    중복된 파일 이름 해결하는 아이디어 파일 업로드 시간을 이용하는 방법 UUID를 이용해 중복이 발생할 가능성이 적은 문자열을 생성하는 방법 1. 파일 업로드 시간을 이용해 파일 생성 private String getFolder() { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = new Date(); String str = sdf.format(date); return str.replace("-", File.separator); } @PostMapping("/uploadAjaxAction") public void uploadAjaxPost(MultipartFile[] uploadFile) { String uploadFolder..

    Spring + Ajax 파일 확장자, 크기 제한 (Ajax)

    var regex = new RegExp("(.*?)\.(exe|sh|zip)$"); var maxSize 10485760; // 10MB function checkExtension(fileName, fileSize) { if (fileSize > maxSize) { alert("파일 사이즈는 10MB 미만이어야합니다."); return false; } if (regex.test(fileName)) { alert("해당 파일의 종류로는 업로드 안됩니다."); return false; } return true; } $("#uploadBtn").on("click", function(e) { var formData = new FormData(); var inputFile = $("input[name='uplo..

    Spring + Ajax 파일 업로드

    서버에서 첨부파일 처리 방식 cos.jar 2002년에 개발이 종료되어, 더 이상 잘 사용되지 않음 commons-fileupload 가장 많이 사용되는 방식 자체적인 파일 업로드 처리 서블릿 3.0 이상부터 자체적인 파일 업로드 처리가 API 상에서 지원 첨부파일시 고려해야할 것들 해당 포스팅은 아래 고려사항들을 적용하여 구현했습니다. 각 링크타고 들어가 포스팅을 읽어보는 것이 도움됩니다. 동일한 이름으로 파일 업로드 시 기존 파일이 사라지는 문제 이미지 파일의 경우 원본 파일의 용량이 큰 경우 섬네일 이미지를 생성해야 하는 문제 이미지 파일과 일반 파일을 구분해서 다운로드 혹은 페이지에서 조회하도록 처리하는 문제 첨부파일 공격에 대비하기 위한 업로드 파일의 확장자 제한 스프링 설정 서블릿 3.0 이상..

    [SpringMVC + MyBatis + MySql] 게시판 댓글 수 게시판 List에 출력

    [SpringMVC + MyBatis + MySql] 게시판 댓글 수 게시판 List에 출력

    결과 테이블 기존 테이블 → board & board_reply 테이블 수정 ALTER TABLE board ADD reply_cnt int default 0; 게시글에 댓글 수 추가 UPDATE board SET reply_cnt = ( SELECT COUNT(reply_id) FROM board_reply WHERE board_reply.board_id = board.id); 기존에 있던 게시글들의 댓글 수 초기화 DTO 수정 : Board.java ... private int reply_cnt; ... public int getReply_cnt() { return reply_cnt; } public void setReply_cnt(int reply_cnt) { this.reply_cnt = repl..

    [SpringMVC + MyBatis + Ajax]  게시판 댓글 추가/삭제/List (Ajax 이용)

    [SpringMVC + MyBatis + Ajax] 게시판 댓글 추가/삭제/List (Ajax 이용)

    결과 기존 게시판 만드는 방법이 아닌 JSON을 사용하였다. 기존에 만든 게시글 밑에 댓글 작성창 만들었다. 댓글 작성창 아래 댓글 List가 보이도록 하였다. 댓글 작성/삭제 시 바로 댓글 List에 반영되도록 하였고 Ajax를 사용하여 비동기 처리를 하였다. Project Explorer 설정들 ▶pom.xml 4.0.0 com.spring boardApp boardProject war 1.0.0-BUILD-SNAPSHOT 11 5.0.7.RELEASE 1.9.0 1.7.25 2.9.5 4.3.14.RELEASE 3.4.6 1.3.2 8.0.27 org.springframework spring-context ${org.springframework-version} commons-logging commo..

    Spring ResponseEntity

    Spring ResponseEntity

    ResponseEntity REST 방식으로 호출하는 경우 데이터 자체를 전송하기 때문에 데이터를 요청한 쪽에서는 정상적인 데이터인지 비정상적인 데이터인지 구분할 수 있는 방법이 필요합니다. 이를 위해 RESTful 웹 서비스를 개발할 때 `ResponseEntity`를 사용합니다. `ResponseEntity`는 HTTP 응답의 상태 코드, 본문 데이터, 헤더 등을 명시적으로 설정하여 클라이언트와의 통신을 할 수 있습니다. 상태 코드 설정: HTTP 응답의 상태 코드를 명시적으로 설정 가능합니다. 응답 본문 설정: HTTP 응답의 본문 데이터를 설정할 수 있습니다. JSON, XML , 문자열 등 다양한 데이터 형식을 지원합니다. 제네릭 타입을 사용하여 데이터 타입을 명시할 수도 있습니다. 응답 헤더 ..

    MyBatis 마이바티스에서 LIKE문 사용하기

    MyBatis 마이바티스에서 LIKE문 사용하기

    LIKE문은 일치하는 문자열을 찾기 위해 사용되는문법입니다. SQL에서 LIKE문을 사용하는 방법은 다음과 같습니다. SELECT * FROM board WHERE title LIKE '%test%' 하지만 MyBatis에서 LIKE 문을 사용하기 위해서는 약간 다른 형태로 사용되며, ORACLE인지, MySQL인지에 따라서도 약간의 차이가 있습니다. ORACLE SELECT * FROM board WHERE title LIKE '%'||#{searchTitle}||'%' MySQL (MariaDB) SELECT * FROM board WHERE title LIKE CONCAT('%',#{searchTitle},'%') Ms-SQL SELECT * FROM board WHERE title LIKE '%'..

    MySQL Column(열) 추가, 삭제, 위치, 컬럼명, 자료형 변경

    MySQL Column(열) 추가, 삭제, 위치, 컬럼명, 자료형 변경

    Column 추가 맨 뒤에 추가 ALTER TABLE 테이블명 ADD 컬러명 자료형; 맨 앞에 추가 ALTER TABLE 테이블명 ADD 컬럼명 자료형 FIRST; 지정(원하는) 위치에 추가 ALTER TABLE 테이블명 ADD 새컬럼명 자료형 AFTER 앞컬럼명; Column 삭제 ALTER TABLE 테이블명 DROP COLUMN 컬럼명; 이때 COLUMN은 생략 가능 Column 위치 변경 맨 앞으로 이동 ALTER TABLE 테이블명 MODIFY COLUMN 컬럼명 자료형 FIRST; 지정(원하는) 위치로 이동 ALTER TABLE 테이블명 MODIFY COLUMN 컬럼명 자료형 AFTER 앞컬럼명 Column 컬럼명, 자료형 변경 컬럼명 변경 ALTER TABLE 테이블명 CHANGE 기존컬럼명..

    Git Repository(원격 저장소) 변경 (feat. Git Bash)

    Git Repository(원격 저장소) 변경 (feat. Git Bash)

    git remote -v 현재 로컬 저장소에서 연결되어 있는 원격 저장소의 주소를 확인 $git remote -v origin {원격 저장소1 주소} (fetch) origin {원격 저장소1 주소) (push) git remote set-url origin {변경할 원격 저장소 주소} $git remote set-url origin {원격 저장소2 주소} origin {원격 저장소2 주소} (fetch) origin {원격 저장소2 주소} (push)

    Git .gitignore 파일 생성

    Git .gitignore 파일 생성

    .gitignore .gitignore에 지정한 파일들은 git 관리 대상에서 제외가 된다. 이는 불필요한 정보, 알려져서는 안되는 정보, 혹은 협업하는 경우 작업 환경이 달라 파일들이 충돌할 경우 이에 해당하는 파일들을 .gitignore에 추가해서 Git 관리 대상에서 제외 시킨다. .gitignore 파일 생성 github에서 Repository(원격 저장소)를 생성할 때 README 파일과 .gitignore 파일을 생성할 수 있다. 위 처럼 자동으로 만들어주는 경우가 아닐 때는 직접 .gitignore 파일을 생성한 다음 직접 작성해도 되지만 편리하게 .gitignore을 만들어주는 사이트가 따로있다. 프로젝트에 맞는 운영체제, 개발 환경(IDE), 프로그래밍 언어를 입력하면 자동으로 생성해준다..

    Git error: failed to push some refs to  ...

    Git error: failed to push some refs to ...

    원인. 원격 저장소(Github)에는 있는 파일이 로컬 저장소(내 컴퓨터)에는 없어서 로컬 저장소에서 원격 저장소로 push하지 못할때 발생하는 오류이다. 해결. 원격 저장소(Github)에 있는 파일들을 로컬 저장소로 가져온(pull) 다음 git pull 예) git pull origin main 로컬 저장소에서 다시 push 하면 정상 작동한다.