목록백엔드 (20)
코딩기록

1. 이슈농구장 위치공유 서비스는 최초엔 비회원 서비스를 계획하고 테이블을 구축하였는데, 추후 회원가입 기능을 구현하게 되어서, 농구장 정보를 수정한 유저 정보 컬럼에 회원 정보와 비회원 정보가 동시에 입력되게 되었다. 즉, 비회원 유저가 농구장 정보를 수정하면 lastChangeUser 컬럼에 비회원ID가 저장되고, 회원 유저가 농구장 정보를 수정해도 같은 컬럼에 회원의 닉네임이 저장되는 상태였다. 두 데이터의 성질이 다르므로, 각각 컬럼을 나누어 저장하는 것이 맞다. 이 상태에선 회원 유저가 닉네임을 수정하면 수정된 닉네임이 농구장 정보 테이블에 반영되지 않는다. 2. 해결농구장 정보 테이블에 회원ID가 저장될 user_id 컬럼과 비회원ID가 저장될 anonymous_id 컬럼을 새롭게 만들었다. ..

1. 서블릿 서블릿이란?WebProgramming에서 Client의 요청을 처리하고 그 결과를 다시 Client에게 전송하는 자바 웹 프로그래밍 기술 서블릿을 사용하는 이유서블릿을 사용하지 않고 직접 HTTP 통신으로 오고가는 문자열을 파싱하여 서블릿과 같은 기능을 구현해도 무방하지만, 이미 편리하게 사용할 수 있는 서블릿을 놔두고 직접 문자열 파싱을 구현하는 것은 개발자가 온전히 비즈니스 로직에 집중하지 못하게 만들 수 있다. 개발자는 서블릿을 통해 문자열 파싱 등에 열올리지 않고 비즈니스 로직에 더욱 집중할 수 있다. 서블릿 동작 방식 1. 개발자가 서블릿 소스코드(.java)를 작성한다. 2. 소스코드가 빌드 시 컴파일되어 서블릿 클래스(.class)가 된다. 3. 해당 서블릿 클래스가 톰캣과 같은..
문제스프링 프로젝트 시작 시 Parameter 2 of constructor in *** required a bean of type 'org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder' that could not be found. 에러가 발생했다. 해결-> SecurityConfig 클래스에 @EnableWebSecurity 추가하면 된다. @Configuration@EnableWebSecuritypublic class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) th..

JVM 이란?자바를 실행하기 위한 가상 기계 OS에 종속적이지 않다 .java 파일 컴파일 과정.java -> Java compiler(javac) -> .class(바이트 코드: JVM이 이해할 수 있는 언어) -> JIT Compiler*, 동적 번역* -> 바이너리 코드(기계어, 컴퓨터가 인식할 수 있는 0과 1로 구성된 이진코드)* 인터프리터 방식으로 실행하다가 적절한 시점에 바이트코드 전체를 컴파일하여 기계어로 변경하고, 이후에는 더 이상 인터프리팅하지 않고 기계어로 직접 실행 JVM 구조1. 클래스 로더(Class Loader) JVM 내로 클래스 파일을 로드하고 링크를 통해 배치하는 작업을 수행 2. 실행 엔진(Excution Engine) - 인터프리터 “ 자바 바이트 코드를 명령어 단위로..

JSP란?자바 언어를 기반으로 하는 스크립트 언어로, HTML 내에 자바 코드를 삽입하여 웹 서버에서 동적으로 웹페이지를 생성하여 웹 브라우저에 전달하는 서버측 스크립트 언어JSP의 동작과정① 웹 브라우저가 웹 서버에 JSP를 요청하면, 웹 서버는 요청된 xxx.jsp에서 jsp 확장자를 발견하여 JSP 페이지임을 확인하고 웹 서버에 있는 JSP 컨테이너로 전달② JSP 컨테이너가 JSP 페이지를 서블릿 프로그램인 xxx_jsp.java로 변환③ JSP 컨테이너가 서블릿 프로그램을 컴파일하여 xxx_jsp.class로 만들고 이를 웹 서버에 전달④ 웹 서버는 xxx_jsp.class의 실행 결과를 웹 브라우저에 응답으로 전달JSP의 생명주기①. jspInit() : JSP 컨테이너는 class를 로딩하고..
1. 문제발생농구장 위치 공유 앱 개발 중, 다음과 같이 전역변수의 값을 retrofit을 통해 설정하려고 하였으나 전역변수에 값이 저장되지 않았다.var hoop = intent.getSerializableExtra("hoop") as Hoopval retrofit = Retrofit.Builder().baseUrl(BuildConfig.API_URL) .addConverterFactory(GsonConverterFactory.create()).build()val service = retrofit.create(RetrofitService::class.java)service.getHoop(hoop.id) .enqueue(object : Callback> { override fun ..
물음표(?)의 사용null이 들어올 수 있는 경우에 붙여줌var notNull:Int = null //오류var notNull:Int? = null //정상 느낌표 두개(!!)의 사용null값이 절대 들어오면 안되는 경우에 붙여줌var notNull:Int = 0 //기본값은 null허용xvar okNull:Int? = 10 //null이 들어올 수 있음을 의미notNull = okNull!! //ofNull은 null을 허용한 상태이기 때문에 !!로 처리해야 오류없이 실행됨//그러나 위의 코드에서 okNull에 null값이 들어가면 오류가 발생함
📒 Facade Pattern이란? 퍼사드 패턴(Facade Pattern)은 구조 패턴(Structural Pattern)의 한 종류로써, 복잡한 서브 클래스들의 공통적인 기능을 정의하는 상위 수준의 인터페이스를 제공하는 패턴이다. 퍼사드 객체(Facade Object)는 서브 클래스의 코드에 의존하는 일을 감소시켜 주고, 복잡한 소프트웨어를 간단히 사용 할 수 있게 간단한 인터페이스를 제공해준다. 퍼사드 패턴을 통해 서브 시스템(SubSystem)들 간의 종속성을 줄여줄 수 있으며, 퍼사드 객체를 사용하는 곳(Client)에서는 여러 서브 클래스들을 호출할 필요 없이 편리하게 사용할 수 있다.

현재 직장인들을 위한 커뮤니티 개발 팀에서 계정 백엔드 개발을 담당하고 있다. Converter를 적용하여 db에 비밀번호를 저장할 경우 자동으로 BCryptPasswordEncoder를 이용하여 저장되게 하였다. 그런데 converter를 구현한지 얼마 되지 않아, 팀원분께서 두번째 로그인을 시도할 때부터 로그인이 되지 않는다는 노티를 해 주셨다. 원인을 찾아본 결과, Converter 의 문제였다. Converter를 적용하여 db에 비밀번호를 저장할 경우 자동으로 BCryptPasswordEncoder를 이용하여 저장되게 하였는데, 그 전에 구현한 기능 중 유저가 로그인 시 해당 로그인 유저의 최근방문시점 및 방문횟수를 업데이트 하도록 구현한 것이 있었다. 기존에 최근방문시점 및 방문횟수를 아래처럼..

스프링 테스트 시 다음 에러가 뜨며 테스트가 진행이 안되었다. org.gradle.api.internal.tasks.testing.TestSuiteExecutionException: Could not execute test class 'com.blanktime.BlankTimeApplicationTests'. at org.gradle.api.internal.tasks.testing.SuiteTestClassProcessor.processTestClass(SuiteTestClassProcessor.java:54) at java.base@17.0.10/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base@17.0.1..