기본 콘텐츠로 건너뛰기

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로 찾을 때 이 속성으로 찾게 된다   ...

오류 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 ...

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 ...

오류 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를...

명령 프롬프트

포트 확인법 #사용 중인 모드 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);      },      erro...

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("*"); }