작업 상태
- querydsl을 vscode에서 작업하던중 발생했습니다.

- vscode 사용중이었고 querydsl 설정은 완료되었고 vscode에서 springboot 시작중에 나온에러입니다.


에러 메시지 

- Project 'back' is missing required source folder: 'src/main/generated/querydsl'

- The type QBoard is already defined


원인

- Q..Entity를 사용했는데 없어서 나오는 에러입니다.


처리

- gradle로 생성해 줍니다.  gradle project > Tasks> ohters > compileQuerydls 실행

생성후 > Entity를 기준으로 Q클래스가 생성됩니다.

- Q클래스들을 생성후 boot를 실행시키면 경우에 따라서 또 다시 아래와 같은 에러가 발생하는 경우가 있습니다.

- The type QBoard is already defined

- 이 에러가 발생한 경우 vscode일 때 새로 생성된 Q클래스들을 인식시키기 위해 전부 생성된 Q클래스들을 클릭해서 열어줍니다.

전부 클릭해서 인식시키후 상황

- 이후 실행하면 정상 실행 됩니다.


참고

- BUILD FAILED in 1s
0. error: Could not find class file com.a3040.member.Member 등 :back:compileQuerydsl FAILED 이 나올경우

이미 Qclass가 생성되어 있는지 확인 queryDsl 이미 실행되어 compileQuerydsl실행 후 프로젝트에 관련 Qclass.java 파일들이 존재하면 발생합니다.

1. 생성된 Qclass가 있는 폴더를 삭제합니다.  > 이후 실행하면 Qclass가 없어서 실행이 안됩니다.

2. gradle project > Tasks> ohters > compileQuerydls 실행 > Qclass는 생성되었으나 이번에는 The type QBoard is already defined: <--이 에러로 실행 안됩니다.

3. vscode에서 자동 생성된 class를 인식시킵니다. 다 열어봄 > 잘 실행 됩니다.

4. 이상태에서 뭔간 변경되어 수정하고 compileQuerydls을 실행할경우 이번에는 기본 Entity 클래스가 없다는 에러가 발생합니다.  0번 부터 다시 확인합니다.

작업 상태

- TodoController라는 콘트롤러에서 json으로 데이터를 받아 update하는 과정에서 발생했습니다.
 
에러 메시지 

- java.lang.Error: Unresolved compilation problems:
        The method setIsCompleted(String) is undefined for the type Optional<Todo>
        The method save(Todo) in the type TodoService is not applicable for the arguments (Optional<Todo>)

원인

 Optional<Todo> currentTodo  currentTodo의 현재 타입은  Optional<Todo>입니다.

Optional<Todo> 는 Todo 클래스가 아니기 때문에 Todo 클래스의 메소드를 사용할수 없습니다.


증상 발생 코드 

@PostMapping("/admin/todos/complete")
public ResponseEntity<String> updateComplete(@RequestBody @Valid Todo todo,
        BindingResult result) {
        Optional<Todo> currentTodo = todoService.findById(todo.getId());
    if (currentTodo.isPresent()) { 
        currentTodo.setIsCompleted(todo.getIsCompleted());
        todoService.save(currentTodo);
        return ResponseEntity.ok("저장되었습니다.");
    } else {
        throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Working not found");
    }
}

 

처리코드

@PostMapping("/admin/todos/complete")
public ResponseEntity<String> updateComplete(@RequestBody @Valid Todo todo,
        BindingResult result) {
        Optional<Todo> searchTodo = todoService.findById(todo.getId());
    if (searchTodo.isPresent()) { 
        Todo currentTodo = searchTodo.get();
        currentTodo.setIsCompleted(todo.getIsCompleted());
        todoService.save(currentTodo);
        return ResponseEntity.ok().build();
    } else {
        throw new ResponseStatusException(HttpStatus.NOT_FOUND, "Working not found");
    }
}


참고

Optional은 Java 8에서 추가된 클래스로, 값이 있을 수도 있고 없을 수도 있는 객체를 감싸는 래퍼 클래스입니다. 이를 통해 NullPointerException 등의 오류를 방지할 수 있습니다. 데이터를 조회해서 가져오는 등의 작업을 할때도 사용됩니다.

 

메소드
of: 주어진 값으로 Optional 객체를 생성합니다. 값이 null인 경우에는 NullPointerException이 발생합니다.
isPresent: Optional 객체에 값이 있는지 여부를 반환합니다.

get: Optional 객체에 저장된 값을 반환합니다. 값이 없는 경우에는 NoSuchElementException이 발생합니다.

 

Optional<String> name = Optional.of("John");// "John"이라는 값을 가진 Optional 객체를 생성합니다.
if (name.isPresent()) {  //값이 있는지 여부를 체크합니다.
    System.out.println("Hello, " + name.get() + "!"); // get 메소드를 이용해값을 가져옵니다.
} else {
    System.out.println("Hello, anonymous!");
}

작업 상태

- 알람 설정 작업을 진행하던 중 08:00 값을 설정하던중 발생했습니다.
 
에러 메시지 

error: SyntaxError: C:\Use...ns\Noti.js: Legacy octal literals are not allowed in strict mode. (15:12)

원인

- strict mode에서 코드에 0으로 시작하는 숫자가 있을 때 발생합니다.  이를 수정하면 됩니다. 또는 0o 접두어를 사용하여 8진수를 대신 표현할 수도 있습니다.

 

// 알림을 보냅니다.
const scheduledTime = new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate(),
     21, 00, 0, 0);


처리

const scheduledTime = new Date(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate(),
     21, 0, 0, 0);

참고

 

JavaScript strict mode

- 더 엄격한 자바스크립트 문법 검사를 수행하는 모드입니다. 
- 기존 자바스크립트와는 다른 규칙을 따르게 됩니다. 

- 암묵적 전역 변수 금지: strict mode에서는 암묵적으로 선언되는 전역 변수를 사용할 수 없습니다. 변수를 명시적으로 선언하지 않으면 ReferenceError가 발생합니다.

- 읽기 전용 속성 및 변수: strict mode에서는 읽기 전용 속성 및 변수를 수정하려고 하면 TypeError가 발생합니다.

- 함수에서 this 사용 제한: strict mode에서는 함수 안에서 this를 사용할 때, 함수가 호출된 방식에 따라 this가 자동으로 전역 객체를 참조하지 않습니다.

- delete 연산자 사용 제한: strict mode에서는 delete 연산자로 변수, 함수, 매개변수 등을 삭제할 수 없습니다.

- 함수 매개변수 이름 중복 제한: strict mode에서는 함수의 매개변수 이름이 중복될 경우 SyntaxError가 발생합니다.

strict mode는 'use strict' 문을 사용하여 활성화할 수 있습니다. strict mode는 파일 전체에 적용될 수도 있고, 함수 내에서만 적용될 수도 있습니다.

 

// 파일 전체에 strict mode 적용
'use strict';

let x = 10;
delete x; // TypeError 발생

function foo(param1, param1) { // SyntaxError 발생
  // ...
}

// 함수 내에서만 strict mode 적용
function bar() {
  'use strict';

  let y = 20;
  delete y; // TypeError 발생

  // ...
}

작업 상태

- redux 사용 방법을 테스트 하던중 발생했습니다.

 

 

에러 메시지 

Uncaught ReferenceError: initialState is not defined
    at counter (redux.html:43:26)
    at dispatch (redux.js:329:23)
    at createStore (redux.js:403:4)
    at redux.html:63:15 


const counter = (state = initialState, action) => {  //이곳에서 에러가 발생했습니다.


원인

 

자바스크립트에서 발생하는 에러입니다. initialState 라는 변수가 정의되지 않아서 발생합니다.

 

일반적으로 

initialState 변수가 정의되지 않은 경우 
initialState 변수가 다른 파일에서 정의된 경우, 해당 파일을 import하지 않은 경우
initialState 변수의 스코프(scope)가 함수 내부에 한정되어 있어, 함수 외부에서 접근할 수 없는 경우
발생합니다.

 

처리

분명히 정의했었는데 이상해서 살펴보니 다른 부분 작업하다가 지워졌습니다.

const initialState = {
  number: 0
};
 
const counter = (state = initialState, action) => {

변수 추가후 특이 사항 없음.


참고

읽던페이지 : 리덕스(Redux)를 왜 쓸까? 그리고 리덕스를 편하게 사용하기 위한 발악 (i) | VELOPERT.LOG

{
    const initialState = {
    number: 0
    };
}
 
const counter = (state = initialState, action) => {  //이런 경우도 스코프를 벗어 났기 때문에 동일한 에러가 발생합니다.

 

Redux
JavaScript 애플리케이션에서 상태 관리를 위한 도구입니다. React와 함께 많이 사용되며, React에서 컴포넌트 간에 상태를 공유하고 업데이트하기 위한 상태 관리 방법으로 Redux를 많이 사용합니다.


Redux 중요한 메소드

createStore(reducer, [preloadedState], [enhancer]): 
애플리케이션의 상태를 저장하고 업데이트하는 스토어를 생성합니다. reducer는 액션에 따라 상태를 업데이트하는 함수이며, preloadedState는 초기 상태값을 나타내며 선택적으로 전달될 수 있습니다. enhancer는 미들웨어와 같은 스토어의 기능을 확장하는 함수입니다.

combineReducers(reducers): 
다수의 리듀서를 하나로 합쳐줍니다. 이를 통해 하나의 애플리케이션 상태를 여러 개의 작은 리듀서로 나눌 수 있습니다.

dispatch(action): 
액션을 발생시킵니다. 액션은 객체 형태로 {type: 'ACTION_TYPE', payload: ...}와 같은 형태로 구성됩니다. 리듀서는 이 액션에 따라 상태를 업데이트합니다.

getState(): 
스토어에 저장된 현재 상태를 반환합니다.

subscribe(listener): 
스토어에 상태가 변경될 때마다 호출되는 콜백 함수를 등록합니다. 이를 통해 상태가 변경될 때마다 UI를 업데이트하거나, 상태 변경을 로그로 기록할 수 있습니다.

applyMiddleware(...middlewares): 
미들웨어를 등록합니다. 미들웨어는 액션을 디스패치하기 전 또는 후에 추가적인 동작을 수행할 수 있습니다. 
Redux Thunk와 같은 미들웨어를 사용하면 비동기 작업을 처리할 수 있습니다.

+ Recent posts