기본 콘텐츠로 건너뛰기

12월, 2022의 게시물 표시

오류 Cannot invoke "jakarta.servlet.http.HttpSession.getServletContext()" because "session" is null

오류 java.lang.NullPointerException: Cannot invoke "jakarta.servlet.http.HttpSession.getServletContext()" because "session" is null at com.ezen.demo.ws.HttpSessionConfig.modifyHandshake(HttpSessionConfig.java:17) ~[classes/:na] at org.apache.tomcat.websocket.server.UpgradeUtil.doUpgrade(UpgradeUtil.java:227) ~[tomcat-embed-websocket-10.1.4.jar:10.1.4] at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:78) ~[tomcat-embed-websocket-10.1.4.jar:10.1.4] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158) ~[tomcat-embed-core-10.1.4.jar:10.1.4] at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[spring-web-6.0.3.jar:6.0.3] at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:1

WebSocket

WebSocket을 사용한 채팅 프로그램 만들기 - Spring boot 기반 고수준 - 웹사이트 접속자 전체를 대상으로 한 채팅 - 특정 이용자 그룹/개인을 대상으로 한 채팅 - http 프로토콜은 접속요청 후 접속되면 응답을 전송하고 접속 해제 - 웹서버 상에 서버소켓을 두고 웹브라우저가 서버소켓에 접속요청 ServerSocket : 네트워크(TCP/IP) 서버, 무한히 클라이언트를 대기 Socket : 서버에 접속요청, 통신가능 특정 이용자간의 통신(채팅) 로그인한 후 이용자의 아이디 활용(HttpSession) WebSocket 클래스에서 메시지 송수신 부분에서 특정 아이디를 가진 이용자의 소켓에 메시지를 전송해야 한다 메세지 구성(JSON) - 송신자, 수신자, 컨텐츠 서버측에서는 메시지를 가로채서 수신자가 누군지 확인/해당 이용자에게만 전송 서버측에서 JSON을 다루기 위해서 json-simple 사용(dependency 추가) 모든 채팅 접속자 리스트 구하기 - 채팅에 접속하는 모든 이용자의 리스트 작성 - 한 이용자가 모든 이용자의 아이디를 구하려면... - 누구나 접근할 수 있는 영역에 접속자 목록을 유지 - 접속자가 이용자 목록을 요청할 때 컨트롤러에서 그 영역에 접속 - 접속자 목록을 JSON 배열 형식으로 응답 - application 영역(Scope)에 모든 접속자의 ID를 기록한다 - ServletContext sc = request.getServletContext(); - sc.setAttribute("userSet",userSet); // list, set, map Controller / WebSocket - Configurator : WebSocket에서 HttpSession을 사용할 수 있도록 설정 pom.xml <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-websocket --> <dep

Thymeleaf

html + Spring EL을 쓴다 Natural Templating : DB, Front End application.perperties # Thymeleaf spring.thymeleaf.cache=false # 기본 경로 spring.thymeleaf.prefix=classpath:/templates/ # .html을 쓴다 spring.thymeleaf.suffix=.html # thymeleaf/ 안에 있는 모든것 spring.thymeleaf.view-names=thymeleaf/* pom.xml <!-- Thymeleaf --> <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> 문법 <div th:text="${greeting}"></div> // div 영역에 텍스트를 넣는다 <a th:href="@{'/' + ${url}}">index.html</a> <div th:if="${gender=='M'}">남자</div> <div th:unless="${gender=='M'}">여자</div> <div th:if="${#strings.equals(param2, 'A')">A</div> <div th:switch="${gender}">     <span th:case="M">Male</span>     <span th:case="F">Femal

Spring JPA(Java Persistence API)

application.properties # JPA # spring.jpa.hibernate.ddl-auto=create는 table을 새로 생성한다 #spring.jpa.hibernate.ddl-auto=create spring.jpa.hibernate.ddl-auto=none spring.jpa.generate-ddl=false spring.jpa.show-sql=true spring.jpa.database=oracle logging.level.org.hibernate=info spring.jpa.database-platform=org.hibernate.dialect.OracleDialect pom.xml <!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-data-jpa --> <dependency>     <groupId>org.springframework.boot</groupId>     <artifactId>spring-boot-starter-data-jpa</artifactId>     <version>3.0.0</version> </dependency> Entity(객체, 속성들의 집합) -> 테이블 생성 Emp.java : Entity 클래스  - 사번, 이름, 부서, 급여, 입사일 <- 컬럼명 인터페이스(JpaRepository 상속)  - 단순한 입출력 기능은 미리 준비되어 있음 @Data @AllArgsConstructor @NoArgsConstructor @Entity @Table(name = "emp4") public class Emp {     @Id // PRIMARY KEY가 된다, id로 찾을 때 이 속성으로 찾게 된다     @SequenceGenerator(sequenceName = "EMP4_

오류 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'boardController': Unsatisfied dependency expressed through field 'svc': Error creating bean with name 'boardService': Lookup method resolution failed

오류 org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'boardController': Unsatisfied dependency expressed through field 'svc': Error creating bean with name 'boardService': Lookup method resolution failed 내용 public PageInfo<Board> getPage() {      PageInfo<Board> page = new PageInfo<>(getList());      log.info(page.toString());      return page; } 해결 public PageInfo<Board> getPage() {      PageHelper.startPage(3,5); // 추가     PageInfo<Board> page = new PageInfo<>(getList());     log.info(page.toString());     return page; }

PageHelper

PageHelper를 이용한 고수준 Pagination 구현 application.properties #mybatis pageHelper pagehelper.helper-dialect=oracle pagehelper.reasonable=true pom.xml <!-- https://mvnrepository.com/artifact/com.github.pagehelper/pagehelper-spring-boot-starter --> <dependency>      <groupId>com.github.pagehelper</groupId>      <artifactId>pagehelper-spring-boot-starter</artifactId>      <version>1.4.6</version> </dependency> Oracle MySQL Java // SQL 문장을 바꿔서, 5개의 행으로 이루어진 페이지의 3페이지를 가져온다 PageHelper.startPage(3,5); // PageHelper.startPage(pageNum=3, pageSize=5); // mapper에서 가져온 List<Board>를 PageInfo 객체로 받는다 PageInfo<Map<String,Object>> pageInfo = new PageInfo<>(mapper.getList()); log.info(pageInfo); model.addAttribute("pageInfo",pageInfo.getList()); return "board/pageForlist"; // 한 개의 글에 딸린 첨부파일의 정보는 한개의 문자열로 결합 SELECT LISTAGG(fname,',') WITHIN GROUP (ORDER BY num) fnames FROM attach GROUP BY bnum;

XCode

Xcode 사용자설정 단축키 만들기 '/Applications/Xcode.app/Contents/Frameworks/IDEKit.framework/Resources/IDETextKeyBindingSet.plist'로 가서 밑에 글을 추가한다. <key>My Custom Actions</key> <dict>      <key>Insert Line Below</key>      <string>moveToEndOfLine:, insertNewline:</string>      <key>Insert Line Above</key>      <string>moveUp:, moveToEndOfLine:, insertNewline:</string> </dict>

(미해결)오류 cannot delete from view without exactly one key-preserved table

오류 오류 보고 - SQL 오류: ORA-01752: cannot delete from view without exactly one key-preserved table 01752. 00000 -  "cannot delete from view without exactly one key-preserved table" *Cause:    The deleted table had            - no key-preserved tables,            - more than one key-preserved table, or            - the key-preserved table was an unmerged view. *Action:   Redefine the view or delete it from the underlying base tables. 내용 해결

오류 java.lang.IllegalArgumentException: The Unicode character [사] at code point [49,324] cannot be encoded as it is outside the permitted range of 0 to 255

오류 java.lang.IllegalArgumentException: The Unicode character [사] at code point [49,324] cannot be encoded as it is outside the permitted range of 0 to 255 내용 해결 한글 이름은 8비트로 포현할 수 없으므로 오류가 난다

나만의 프로그래밍 언어

Class Class Person(String name="이름", String phone="010-0000-0000", String email="이름@naver.com") {     return "Person(" + name + ", " + phone + ", " + email + ")"; } 변수 int value(0); // value라는 int타입 변수를 선언하고 0으로 초기화 value(10); // value라는 int타입 변수에 10이라는 값을 넣는다 value(); // value변수의 값을 꺼낸다 int value(x(0),y(0))->x+y; value(); 함수 int test(int x, int y) {     return x + y; } test(x(10), y(20)) // 30 괄호 안에서도 로직을 짤 수 있다 쉼표로 문장을 구분 Optional List [] Map <> Set {} set.contains {     // 실행문 } 형변환 int('12') # 12 str(10) # '10' 반환 타입 function a (int a, int b) -> int { } 함수 선언 형식 hello() {     print("Hello, World!"); } map map = map() map.key = "value" # {"key":"value"} map.name = "smith" # {"key":"value","name":"smith"} function(인수_1: 타입_1, 인수_2:타입_2): 반환값 {     // 내용 } var // 변하는 값 const // 변하지 않는 값

오류 Error creating bean with name 'boardController': Lookup method resolution failed

오류 Error creating bean with name 'boardController': Lookup method resolution failed 내용 @PostMapping({"/add"}) public Map<String,Object> addBoard(Board b) {      Map<String,Object> map = new HashMap<>();      map.put("result", "result");      return map; } 해결 @PostMapping({"/add"}) @ResponseBody public Map<String,Object> addBoard(Board b) {     Map<String,Object> map = new HashMap<>();     map.put("result", "result");     return map; }

오류 Field dao in com.ezen.demo.controller.BoardController required a bean of type 'com.ezen.demo.mapper.BoardMapper' that could not be found.

오류 Field dao in com.ezen.demo.controller.BoardController required a bean of type 'com.ezen.demo.mapper.BoardMapper' that could not be found. 내용 <mapper namespace="com.ezen.demo.mapper.EmpMapper"> 해결 <mapper namespace="com.ezen.demo.mapper. Board Mapper">

Spring lombok

https://projectlombok.org/download @Data @ToString @EqualsAndHashCode(exclude= {"ename","deptno","sal","hiredate"}) @AllArgsConstructor @NoArgsConstructor log.info("{}","hello, World!");

application.properties

server.port = 80 #spring.mvc.view.prefix=/WEB-INF/jsp/ #spring.mvc.view.suffix=.jsp #Oracle DataSource spring.datasource.driver-class-name=oracle.jdbc.OracleDriver spring.datasource.url=jdbc:oracle:thin:@127.0.0.1:1521/xe spring.datasource.username=SCOTT spring.datasource.password=TIGER ## MULTIPART (MultipartProperties) # Enable multipart uploads spring.servlet.multipart.enabled=true # Threshold after which files are written to disk. spring.servlet.multipart.file-size-threshold=2KB # Max file size. spring.servlet.multipart.max-file-size=200MB # Max Request Size spring.servlet.multipart.max-request-size=215MB #mybatis pageHelper pagehelper.helper-dialect=oracle pagehelper.reasonable=true # JPA #spring.jpa.hibernate.ddl-auto=create spring.jpa.hibernate.ddl-auto=none spring.jpa.generate-ddl=false spring.jpa.show-sql=true spring.jpa.database=oracle logging.level.org.hibernate=info spring.jpa.database-platform=org.hibernate.dialect.OracleDialect # Thymeleaf spring.thymeleaf.cache=false spr

Spring MyBatis

EmpMapper.java @Mapper EmpMapper.xml <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> xml 문법 <mapper namespace="com.ezen.demo.mapper.EmpMapper"></mapper> <select id="list" resultType="com.ezen.demo.vo.Emp">SELECT * FROM emp3</select> id="list" // mapping되어있는 메소드 이름 parameterType="java.util.Map" // 메소드의 파라미터 타입 resultType="com.ezen.demo.vo.Emp" // SQL 문장이 실행될 때 만들어지는 객체의 타입 <where></where> <if test="deptno != null and deptno != ''"></if> <foreach collection="list" item="item" separator=" "></foreach> separator="union all" // 합집합, 상하로 합친다 #{value} <![CDATA[ // <를 태그로 인식하지 않는다 ]]>

오류 Incorrect result size: expected 1, actual 0

오류 Incorrect result size: expected 1, actual 0 내용 public boolean isDeptno(int deptno) {      String sql = "SELECT * FROM dept WHERE deptno=?";      return jdbcTemplate.queryForObject(sql, (rs,i)->{           return rs.getString("deptno");      },deptno)!=null; } 해결 public boolean isDeptno(int deptno) {      String sql = "SELECT * FROM dept WHERE deptno=?";      try {           jdbcTemplate.queryForObject(sql, (rs, i) -> {                return rs.getString("deptno");           }, deptno);           return true;      } catch (Exception e) {           return false;      } }

Spring JdbcTemplate

문법 @Autowired private JdbcTemplate jdbcTemplate; query jdbcTempalte.query(sql, (rs,i)->{      Emp emp = new Emp();      emp.setEmpno(rs.getInt("EMPNO"));     emp.setEname(rs.getString("ENAME"));     ...     return emp; }, Object...); // select, RowMapper 함수형 인터페이스, ORM(Object Relational Mapping) 오라클 데이터의 한행과 자바의 한 객체와 연결한다, List<Emp>로 반환한다 update jdbcTemplate.update(sql, Object...); // insert, update, delete dao @autowired private DAO dao; Sequence(GeneratedKeyHolder) 사용법 어떤 컬럼이 PK인지 인식을 시켜줘야함 GeneratedKeyHolder kh = new GeneratedKeyHolder(); jdbcTemplate.update((conn)->{     PreparedStatement pstmt;     String sql = "INSERT INTO emp3 (empno,...) VALUES (?,...)";     pstmt = conn.prepareStatement(sql, new String[]{"empno"});     pstmt.setInt(emp.getEmpno());     ...     return pstmt; }, kh); GeneratedKeyHolder 키 값 가져오기 int insertedEmpno = kh.getKey().intValue(); return insertedEmpno;

오류 further occurrences of HTTP request parsing errors will be logged at DEBUG level.

오류 further occurrences of HTTP request parsing errors will be logged at DEBUG level. 해결 function isDeptno(deptno) { console.log(deptno); $.ajax({ url : "emp/deptno", // url : " / emp/deptno", method : "post", data : "", dataType : "json", cache : false, success : function(res) { alert(res.result); return res.result; }, error : function(xhs, status, err) { alert(err); } }); }

pom.xml

<? xml version = "1.0" encoding = "UTF-8" ?> < project xmlns = "http://maven.apache.org/POM/4.0.0" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd" > < modelVersion >4.0.0</ modelVersion > < parent > < groupId >org.springframework.boot</ groupId > < artifactId >spring-boot-starter-parent</ artifactId > < version >3.0.6</ version > < relativePath /> <!-- lookup parent from repository --> </ parent > < groupId >com.koreamtc</ groupId > < artifactId >MTC_Homepage</ artifactId > < version >1.1.2</ version > < name >MTC_Homepage</ name > < description >Demo project for Spring Boot</ description > < propertie

Eclipse

최대 라인 수 지정 안하고 ctrl + shift + f 하기 https://stackoverflow.com/questions/3697287/eclipse-set-maximum-line-length-for-auto-formatting

Spring

Spring Database - JDBC - JdbcTemplate - MyBatis - JPA(Java Persistence API) pom.xml <!-- Spring Web --> <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-web</artifactId> </dependency> 컨트롤러,서비스,다오(DAO)는 반드시 내가 만든 spring 프로젝트 패키지 하위 경로에 작성해 주어야 한다 예) com.ezen.demo라는 패키지로 spring 프로젝트를 생성한 후 이 프로젝트의 컨트롤러, 서비스, 다오를 만든다고 한다면,  com.ezen.demo.controller, com.ezen.demo.service, com.ezen.demo.dao를 경로로 컨트롤러, 서비스, 다오를 만든다. @Controller // 컨트롤러 @Service // 서비스 @Repository // 저장소 @Transactional // 2개 이상의 작업이 동시에 성공일 때 성공 나머지는 실패 MultipartFile[] // 파일 받는 클래스 org.springframework.http.ResponseEntity<Resource> // 파일을 다운로드 할 수 있는 반환타입 ResourceLoader.getResource("WEB-INF/file") // WEB-INF(상대 경로)에 있는 file(리소스)를 가져옴 org.springframework.core.io.Resource jsp 오류 없애는 법 demo 우클릭 -> Build Path -> Configure Build Path -> Project Facets -> Apply -> Dynamic Web Module 2.5를 5.0으로 변경하고 Apply get 방식

명령 프롬프트

포트 확인법 #사용 중인 모드 port 확인 netstat -a #port가 사용중인지 확인 netstat -aon | findstr [port 번호] #port를 사용하고 있는 PID를 통해서 서비스 확인 tasklist | findstr [PID] #서비스 이름을 사용해서 서비스가 사용하는 port 확인 tasklist | findstr [서비스 이름] # taskkill /pid [PID] /f [출처,https://datalibrary.tistory.com/66] 경로 이동 명령 프롬프트 로컬 디스크 이동 C:

jar

압축 jar cvf 파일명.jar 압축할파일 json-simple jstl ojdbc8

JSTL

Servlet에서 사용법 https://mvnrepository.com/artifact/javax.servlet/jstl/1.2 Spring에서 사용법 pom.xml에 추가 <dependency> <groupId>org.glassfish.web</groupId> <artifactId>jakarta.servlet.jsp.jstl</artifactId> <version>2.0.0</version> </dependency>

오라클

맥북 docker login docker search oracle -xe-11g docker pull jaspeen/oracle-xe-11g docker run --name oracle -d -p 8080:8080 -p 1521:1521 jaspeen/oracle-xe-11g docker exec -it oracle sqlplus system oracle SELECT * FROM all_users; CREATE USER SCOTT IDENTIFIED BY TIGER; GRANT CONNECT, resource to SCOTT; the account is locked sqlplus /nolog ALTER USER 계정이름 ACCOUNT UNLOCK; Spring Framework <-> Oracle 1. jdbc 저수준 코드를 사용하는 방법(프로젝트에 jdbc 드라이버 등록) 2. Spring Framework 지원 jdbc 라이브러리 사용 3. 2 + ORM Framework(MyBatis) 4. JPA(Java Persistence API)

Servlet

?? ??? 오류 response.setContentType("application/x-json; charset=UTF-8"); 상대 경로로 절대 경로 구하기 ServletContext.getRealPath("/WEB-INF/files"); // 상대 경로 '/WEB-INF/files'의 절대 경로가 반환된다

수학

조화평균 예를 들어 평점 5점만점에 3.0평점 한명과 4.5평점 한명이 있다고 치자. 그러면 2평점의 평균 평점은 몇점인가? a = (1/3.0) + (1/4.5); // 두 평점의 역을 더한다. b = a/2 // 합한 평점의 역을 총 평점의 수로 나눈다. c = 1/b // 총 평점의 수로 나눈 역인 c가 조화평균이 된다. c = 3.6; // 결국 평균 평점은 3.6점이된다. 최대 공약수 어떤 수를 나눌 수 있는 최고 큰 정수

NeoVim

설치 curl -LO https://github.com/neovim/neovim/releases/download/nightly/nvim-macos.tar.gz tar xzf nvim-macos.tar.gz ./nvim-macos/bin/nvim

JSP

taglib <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <%@taglib prefix="f" uri="http://java.sun.com/jsp/jstl/functions"%> forEach 문 <c:forEach var="item" value="${list}">${item.value}</c:forEach> <c:forEach varStatus="i" begin="0" end="10">     ${i.index} </c:forEach> if 문 <c:if test="${조건문}"> </c:if> <c:if test="${not empty status}"> </c:if> else if 문 <c:choose>      <c:when test="${조건문}">      </c:when>      <c:otherwise>      </c:otherwise> </c:choose> 문법 == : eq, != : ne, null == : empty null != : not empty 변수 선언 <c:set var="length" value="${f:length(list)}">

JSON

형식 { "key" : "문자열" , "key2": 1 , "key3" : null, "key4" : true } 

AJAX

jQuery 문법 $.ajax({     url:"URL",     method:" get || post",     data:  {"key":"value"} ||  $("#form").serialize(),     cache:true || false,     dataType:"json" || "text",     success:function(res){          alert(res.result);     },     error:function(xhs,status,err){          alert(err);     } }); $.ajax({      url : "/board/upload",      method : "post",      enctype : "multipart/form-data",      data : new FormData($("#uploadForm")[0]),      cache : false,      dataType : "json",      processData : false,      contentType : false,      timeout : 600000,      success : function(res) {           alert(res.result);      },      error : function(xhs, status, err) {           alert(err);      } }); ? 오류 response.setContentType("application/x-json; charset=UTF-8"); $. ajax ({ /* 요청 시작 부분 */ url: url, //주소 data: formData, //전송 데이터 type: "PO

Java

현재 날짜 java.util.Date today = new java.util.Date(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd,hh:mm:ss"); String date = sdf.format(today); 현재 날짜 한줄로 new SimpleDateFormat("yyyy-MM-dd").format(new Date()); java.util.Date에 java.sql.date저장 java.util.date date = this.rs.getTimestamp("date"); Timestamp timestamp = new Timestamp(System.currentTimeMillis()); 직렬화 설정하기 implement Serializable 객체를 파일에 저장하기 new ObjectOutputStream(new FileOutputStream(new File("D:\document\data.ser"))).writeObject(new Object()); new ObjectOutputStream(/* 생략 */).flush(); // ObjectOutputStream, FileOutputStream은 new 할 때 파일을 생성한다. // Object 객체를 파일에서 불러오기 (Object)new ObjectInputStream(new FileInputStream(new File("D:\document\data.ser"))).readObject(); 람다 표현식 @FunctionalInterface // 함수형 인터페이스 interface Sample {     public abstract int method(int a, int b); } public static void useSample(Sample s, int a, int b) {     System.out.println(s.method(a,b)); useSamp

Java JDBC

Conn Class.forName("oracle.jdbc.OracleDriver"); Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe","SCOTT","TIGER"); Statement Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("SELECT * FROM table"); - executeUpdate(); // 실패일 때 0 한행 추가나 삭제, 수정은 1, 그 이상은 2이상의 숫자 반환 PreparedStatement PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM ?"); pstmt.setString(1,"table"); ResultSet rs = pstmt.excuteQuery(); ResultSet if (rs.next()) }      String s = rs.getString("*"); }